PHP函数

函数定义是全局的,意味着PHP在执行任何代码之前会先收集所有函数定义,函数无需在调用之前被定义,除非是有条件定义或嵌套定义。嵌套定义的函数跟外部函数没有任何关系,不能使用它的任何变量或参数,只是恰好在另外一个函数内部,且嵌套函数也具有全局性,可以在外部调用。PHP函数不支持重载,不能取消已经定义或重定义已声明的函数。既然函数名不区分大小写,用小写和下划线风格是一个好的习惯。

函数参数求值是从左到右,支持默认参数,默认参数必须是常量。函数参数支持类型声明,形如:function f(int $a, int $b) {}有效的类型包括:类名、self、array、callable、bool、float、int、string。默认情况下,PHP将会强迫错误类型的值转为函数期望的标量类型,严格模式不允许这种转换,严格模式通过declare(strict_types=1);开启。如果类型不对,将会产生一个错误,在PHP7中将会抛出TypeError异常。

PHP支持可变参数列表,在PHP5.6及之后由...语法实现,形如:function sum(...$numbers) {},在更早的版本使用函数func_num_args(),func_get_arg(),func_get_args()实现。

函数定义的参数列表,在调用时可以不提供全,没有的参数是unset的,但是不推荐这样做。

返回值:建议不要使用引用返回,因为PHP的特性是copy-on-write,当仅返回而不修改时其实引用的是同一个对象。引用在PHP中设计的并不怎么好。PHP7中可以指定返回值的类型:形如function sum($a, $b): float

可变函数:作用在于回调函数、函数表,一个变量名后有圆括号,PHP将寻找与变量值同名的函数,并且尝试执行它,形如:$func() $foo->$funcname() Foo::$funcname()。可变函数要求的值跟callable类型一致,即$func = array("Foo", "bar”); $func = array(new Foo, "baz”); $func = 'foo’; 可变函数不支持语言内置结构(echo isset)

匿名函数:也叫闭包函数(closures),匿名函数通过Closure类实现的,PHP会自动把此种表达式转换为内置类Closure的对象实例。闭包可以从父作用域中继承变量,用use语言结构传递进去。

$message = 'hello';
$example = function($arg) use ($message) {
     var_dump($message);
};
echo $example();

类中的匿名函数会自动绑定当前实例$this,为了不绑定当前实例得把匿名函数定义为静态的(static)。

Leave a Reply

Your email address will not be published. Required fields are marked *