一、概念
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”。

