基本介绍
函数是一组用来执行多条语句的代码块,它能够接受参数和返回数据,其用途需明确,其逻辑需具有整体性,否则便没有存在的意义。
function example(string $name, int $age){
echo "大家好,我叫 $name <br />";
echo "我出生于:" . (date('Y') - $age) . "年 <br />";
return "谢谢!";
}
echo example("iGuoji", 26);
上例是一个简单的函数,它具有参数和返回值,也有自己的功能和逻辑。
函数中可以存在函数、类、以及任何其他有效的PHP代码。
函数的命名规则如变量的命名规则一样,但不区分大小写。
函数不支持重载,也不能取消定义或是重复定义。
函数无需在被调用之前定义,但也不是那么的绝对,有点类似 ES6
中的变量提升。
// 提前调用
echo example("iGuoji", 26);
// 定义函数
function example(string $name, int $age){
echo "大家好,我叫 $name <br />";
echo "我出生于:" . (date('Y') - $age) . "年 <br />";
return "谢谢!";
}
// 再次提前调用另一个函数
foobar();
// 结果自然是报错了
if(TRUE){
function foobar(){
echo 'hello world';
}
}
上例中的两个函数调用和定义都差不多,区别是一个直接定义的,另一个是在某个条件达成之下才定义,所以由此可知,PHP在解析的时候只是粗略的扫了一眼,知道第一个函数可以直接定义,但是第二个函数还需要条件判断成功才能定义,所以PHP只处理第一个,第二个先不管。
简单而言,函数在被调用之前,不能存在按条件定义。
PHP 中的所有函数和类都具有全局作用域,不用管它是在哪里定义的。
// 如果不先调用我,那么下面的每一行代码都将出错
example();
// 函数调用
foobar();
// 静态方法调用
Laravel::register();
// 类的实例化
$laravel = new Laravel();
$laravel->boot();
// 定义函数
function example(){
// 函数中的函数
function foobar(){
echo "hello ";
}
// 函数中的类
class Laravel{
public function boot(){
echo 'world';
}
static function register(){
echo '<p>PHP 是世界上最好的语言</p>';
}
}
}
// 最终输出
/*
hello
PHP 是世界上最好的语言
world
*/
参数介绍
参考:6.1 函数参数
返回值
函数的返回值通过return
语句来执行,可以返回一个任意类型的数据给函数调用者,同时终止函数执行,不能同时返回多个数据,但可以返回一个数组来达到类似的效果。
返回值的类型,可以在函数定义时进行声明,非严格模式下会尽量进行自动转换来达到预期的效果,实在转换不了或是严格模式下就会直接报错。
// 求和函数
function sum(int $x, int $y) : int{
return $x + $y;
}
// 输出 3
echo sum(1, 2.5);
当一个父类中的方法声明了返回值类型时,另一个子类在重写这个方法时,也必须声明相同类型的返回值,如果父类没有声明返回值类型,则子类可以随意发挥。
可变函数
参考:6.2 可变参数
匿名函数
匿名函数,也叫做闭包函数,是指一个没有名字临时创建的函数,通常用做回调函数。
匿名函数目前是通过 Closure
类来实现的。
匿名函数特点之一,结尾的大括号后面需要加分号,如};
,否则报错后会让你怀疑人生。
// 匿名函数
$foobar = function(){
echo "hello world";
};
// 输出 hello world
$foobar();
匿名函数特点之二,通过 use
可以继承父作用域里的变量。
// 普通变量
$string = "hello world";
// 匿名函数
$foobar = function() use ($string){
echo $string;
};
// 输出 hello world
$foobar();
需要注意的是,use
不能传递超全局变量、$this
、或是和参数重名的变量,而且传递的 方式是值传递。
网友评论