PHP可变函数
一、概念
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"。
广告合作
QQ群号:4114653
温馨提示:
- 本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。邮箱:2942802716#qq.com(#改为@)。
- 本站原创内容未经允许不得转裁,转载请注明出处“站长百科”和原文地址。