一、概念
PHP 的可变函数是一种特殊的函数调用方式,它允许通过变量来调用一个函数。具体来说,就是将函数名作为一个字符串存放在变量中,并在变量后面加上括号即可执行该函数。
如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执行它。这种特殊的函数调用方式称为可变函数,它可以用来实现一些高级的编程用途,例如回调函数和函数表。
对于某些语言结构,例如echo,print,unset(),isset(),empty(),include,require等等,不能直接使用 PHP 可变函数来调用,需要使用包装函数来代替。这是因为可变函数只能用于普通函数调用,而这些语言结构并不是函数。
二、可变函数示例
<?php function foo() { echo "In foo()<br />\n"; } function bar($arg = '') { echo "In bar(); argument was '$arg'.<br />\n"; } // 使用 echo 的包装函数 function echoit($string) { echo $string; } $func = 'foo'; $func(); // 调用 foo() $func = 'bar'; $func('test'); // 调用 bar() $func = 'echoit'; $func('test'); // 调用 echoit() ?>
以上代码创建了一个变量 $func,并将其值分别设置为 ‘foo’、’bar’ 和 ‘echoit’。然后,通过将 $func 作为参数传递给相应的函数,依次调用了这三个函数。
三、可变方法
<?php class Foo { function Variable() { $name = 'Bar'; $this->$name(); // 调用 Bar() 方法 } function Bar() { echo "This is Bar"; } } $foo = new Foo(); $funcname = "Variable"; $foo->$funcname(); // 调用 $foo->Variable() ?>
以上代码定义了一个名为 Foo 的类,其中包含两个方法:Variable() 和 Bar()。在 Variable() 方法中,定义了一个变量 $name,并将其值设置为 ‘Bar’。
四、Variable方法和静态属性
当调用静态方法时,函数调用要比静态属性优先:
<?php class Foo { static $variable = 'static property'; static function Variable() { echo 'Method Variable called'; } } echo Foo::$variable; // 打印 'static property'。在该作用域中需要 $variable。 $variable = "Variable"; Foo::$variable(); // 在该作用域中读取 $variable 调用 $foo->Variable()。 ?>
以上代码包含一个静态属性 $variable 和一个静态方法 Variable()。静态属性是一个类变量,可以在不创建类的实例的情况下访问;静态方法是一种特殊类型的方法,它可以直接通过类名调用,而不需要创建类的实例。
五、复杂调用
<?php class Foo { static function bar() { echo "bar\n"; } function baz() { echo "baz\n"; } } $func = array("Foo", "bar"); $func(); // 打印 "bar" $func = array(new Foo, "baz"); $func(); // 打印 "baz" $func = "Foo::bar"; $func(); // 打印 "bar" ?>
- 当 func 为数组时,第一个元素是字符串 “Foo”,第二个元素是字符串 “bar”。因此,func为数组时,第一个元素是字符串”Foo”,第二个元素是字符串”bar”。因此,func() 将输出 “bar”。
- 当 $func 为数组时,第一个元素是对象实例 new Foo,第二个元素是字符串 “baz”。由于数组中的第一个元素是一个对象实例,而不是一个类名,所以 $func() 将尝试调用该对象的 baz() 方法,输出 “baz”。
- 当 $func 为字符串时,值为 “Foo::bar”。这意味着 $func() 将尝试调用 Foo 类的静态方法 bar(),输出 “bar”。