形参
function parameter($a,$b)
{
}
//argument
parameter(1);
Warning: Missing argument 2 for parameter()
parameter(1,2,3);
没问题
函数调用完,形参就随着函数离去了
但是实参呢,还是一直保留
传进去的 参数可以是表达式,但是函数定义的时候,形参不可以是表达式
function youknow($b,$c)
{
$c= $b +$c;
echo $c;
}
$a=123;
$b=456;
youknow($a+$b,2,3);
默认值
比如定义一个数据库,默认的账号密码,还有DSN是固定的对吧,就可以做一个默认值,这样就不需要每次都传进去了
function hi($a1=1,$a2=2,$a3=3)
{
echo 'a1 is:',$a1,"\n";
echo 'a2 is:',$a2,"\n";
echo 'a3 is:',$a3,"\n";
}
hi(null,22,undefined);
最好把要当做默认值的放在最后边吧,不然每次都用个NULL,用NULL吧,又会把默认值改了
function greet_to_someone($name,$is_normal=false)
{
// if($is_normal?true:false )
if( $is_normal? true : false)
{
echo "Hello ",$name,"\n";
}
else
{
echo "Hi ",$name,"\n";
}
}
greet_to_someone('Lily',1);
强类型
echo 1236+'aaa';
=1236
//字符串不见了
echo 1236+'1aaa';
=1237
echo 'aa234'+'a1aaa';
echo 'aa234','a1aaa';
第一个是等于0
第二个是等于字符串拼接
如果我告诉你,我要的是INT,你要是敢给我一个FLOAT,那就叫PHP终止运行
function AandB($a,$b)
{
return $a+$b;
}
echo AandB(1,2);
// 现在声明,传进来的两个参数一定需要是INT
//不过这个时候,你传一个浮点进来,他回话造成数据丢失。
function AandB2(int $a,int $b)
{
return $a+$b;
}
echo AandB2(1.2,2);
//现在告诉PHP,如果我要是INT,你传进来非INT,那就直接抛出错误,防止造成数据精度丢失
declare(strict_types=1);
function AandB3(int $a,int $b)
{
return $a+$b;
}
echo AandB3(1.2,2);
这个NULL就这么厉害?无论我指定什么类型,都是传一个NULL进来,坑哦
可变参数
也就是说,传进来的参数不确定是多少个,有可能有,也可能没有,有可能多,也有可能少
function ChangeNumbers(...$numbers)
{
//如果数组是空的
if (!$numbers) {
return 0;
} else {
$temp = 0;
foreach ($numbers as $getonevalue) {
$temp += $getonevalue;
}
return $temp;
}
}
echo ChangeNumbers(1,2,3,4,5,6,7,8,9);
实参
值传递,
只能是实参传递给形参,但是形参呢,修改不了函数外边的实参,
当然你用GLOBALS,global这两个超全局变量就可以了
$a = 123;
function test($a)
{
global $a;
$a += 1;
return $a;
}
echo test(123);
echo "\n", $a;
这个世上,$a变成了
引用传递
有点类似与C的指针
&引用传递还是有作用域的,并没有办法说一个指针指完天下的
变量的作用域
- 在A文件声明的变量,在函数内,类内,以及其他文件内。都是失效的,
- 在函数内声明的变量,只在函数内有效,
- 在类声明的属性(不叫变量了,呵呵),只在该类有效,不过继承之后好像是PUBLIC的可以???
如果A文件引用了B文件,那边里边的所有定义的变量还有函数,以及类。都可以在A里边用啦
不信看图
4. 局部变量
5. 全局变量
如果在一个函数内部给一个声明为 global 的变量赋于一个引用,该引用只在函数内部可见。可以通过使用 $GLOBALS 数组避免这一点。
- 静态变量STATIC
跟C的很像
函数运行完毕,里边的变量就会被释放掉,
如果不想要里边的数据被释放,可以用GLOBALS超全局变量,或者说用STATIC
然后再试试先进的STATIC
假如没有用这两个办法来干预,看看会如何
不过static赋值的时候,不可以是函数表达式。
看看GLOBALS能不能是函数表达式。
或者直接static =$aa?
也不可以是函数的哦。没办法,static就规规矩矩来一个常量就好了。