PHP学习日记 函数
可变函数
PHP支持可变函数的概念。所以如果一个变量后面有圆括号“()”,PHP将寻找与变量值同名的函数,并尝试执行此函数,可变函数可以用来实现回调函数、函数列表等。可变函数不能用于echo、print、unset、isset、array等等类似的语言结构,需要使用自己的包装函数来将这些结构作为可变函数。可变函数还可以用于对象方法的调用。
<?php function foo(){ echo "foo\n"; } function bar(){ echo "bar\n"; } $func="foo"; $func(); $func="bar"; $func(); $func="echo"; $func("echo"); ?>
PHP5.4起,如果数组中为合法调用,则可以做为可变函数,用于调用类中方法时使用,数组长度必须为2,第一个值为类名或其他合法形式,第二值为要调用的方法名。PHP7.0起支持ClassName::methodName为可变函数。
<?php class Foo { static function bar() { echo "bar\n"; } function baz() { echo "baz\n"; } } $func = array("Foo","bar"); $func(); // prints "bar" $func = array(new Foo, "baz"); $func(); // prints "baz" $func = "Foo::bar"; $func(); // prints "bar" as of PHP 7.0.0; prior, it raised a fatal error ?>
内置函数
PHP超全局变量PHP 有很多标准的函数和结构。还有一些函数需要和特定地 PHP 扩展模块一起编译,否则在使用它们的时候就会得到一个致命的“未定义函数”错误。有很多核心函数已包含在每个版本的 PHP 中如字符串和变量函数。调用 phpinfo() 或者 get_loaded_extensions() 可以得知 PHP 加载了那些扩展库。同时还应该注意,很多扩展库默认就是有效的。
匿名函数
匿名函数PHP5.3新增,也叫闭包函数,是一个临时创建的没有指定名称的函数,经常用做回调函数参数的值。匿名函数是通过闭包类Closure来实现的。PHP会自动把匿名函数转换为Closure对象的实例。把一个Closure对象赋值给一个变量与普通的变量赋值是一样的。通过使用use语言结构可以匿名函数可以从父作用域继承变量。继承变量有两种方式,一种是继承变量的值,一种是变量的引用。此外,匿名函数还可以接受普通的参数。匿名函数的父作用域是定义该匿名函数的函数。
<?php $message = 'hello'; // 没有 "use" $example = function () { var_dump($message); }; //值为null $example(); // 使用"use" 继承 $message $example = function () use ($message) { var_dump($message); }; //值为hello $example(); $message = 'world'; //值传递,继承变量的值在方法定义时被确定,所以输出为hello $example(); //引用传递 $example = function () use (&$message) { var_dump($message); }; //参数值的修改会传递到匿名函数内,所以输出为World $message = 'World'; $example(); // $example = function ($arg) use (&$message) { var_dump($arg.$message); }; $example("hello"); ?> PHP5.4起,$this可在匿名函数中使用。 <?php class Test { public function testing() { return function() { var_dump($this); }; } } $object = new Test; $function = $object->testing(); $function(); ?>
PHP7.1起,匿名函数继承的变量不能是超全局变量、$this以及与函数参数名同名的变量。
静态匿名函数
PHP5.4起,当在类的上下文中声明匿名函数,当前类会自动绑定到匿名函数,使$this变量在函数中可用,如果不想自动绑定当前类,就需要声明为静态匿名函数。
<?php class Foo{ function foo(){ $func=static function(){ var_dump($this); }; return $func(); } } $foo=new Foo; $foo->$foo();