PHP可变函数

2023-10-23 122

一、概念

PHP 的可变函数是一种特殊的函数调用方式,它允许通过变量来调用一个函数。具体来说,就是将函数名作为一个字符串存放在变量中,并在变量后面加上括号即可执行该函数。

如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执行它。这种特殊的函数调用方式称为可变函数,它可以用来实现一些高级的编程用途,例如回调函数和函数表。

对于某些语言结构,例如echo,print,unset(),isset(),empty(),include,require等等,不能直接使用 PHP 可变函数来调用,需要使用包装函数来代替。这是因为可变函数只能用于普通函数调用,而这些语言结构并不是函数。

二、可变函数示例

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?<a href="https://www.zzbaike.com/tag/php" title="查看所有文章关于 php" target="_blank">php</a>
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()
?>
<?<a href="https://www.zzbaike.com/tag/php" title="查看所有文章关于 php" target="_blank">php</a> 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() ?>
<?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 作为参数传递给相应的函数,依次调用了这三个函数。

三、可变方法

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?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()
?>
<?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() ?>
<?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方法和静态属性

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?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()。
?>
<?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()。 ?>
<?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()。静态属性是一个类变量,可以在不创建类的实例的情况下访问;静态方法是一种特殊类型的方法,它可以直接通过类名调用,而不需要创建类的实例。

五、复杂调用

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?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"
?>
<?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" ?>
<?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

温馨提示:
1、本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。邮箱:2942802716#qq.com(#改为@)。 2、本站原创内容未经允许不得转裁,转载请注明出处“站长百科”和原文地址。
PHP可变函数
上一篇: TeamViewer黑白名单
PHP可变函数
下一篇: PHP内置函数