PHP教程

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群号:707632017

温馨提示:

1、本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。邮箱:2942802716#qq.com。(#改为@)

2、本站原创内容未经允许不得转裁,转载请注明出处“站长百科”和原文地址。

目录