可变函数

PHP 支持可变函数的概念。这意味着如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执行它。可变函数可以用来实现包括回调函数,函数表在内的一些用途。

可变函数不能用于例如 echoprintunset()isset()empty()includerequire 以及类似的语言结构。需要使用自己的包装函数来将这些结构用作可变函数。

示例 #1 可变函数示例

<?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()
?>

也可以用可变函数的语法来调用一个对象的方法。

示例 #2 可变方法范例

<?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()

?>

当调用静态方法时,函数调用要比静态属性优先:

示例 #3 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()。

?>

示例 #4 复杂调用

<?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"
?>