是否允许在 PHP 中链接调用方法?
Is it allowed to chain invoke method in PHP?
例如,我有以下内容:
class A{
__invoke(){
// return an instance of class A itself
}
}
那么我可以做以下事情吗?
new A()()()()... or (new A())()()()...
这里的解释是什么?
假设 PHP 版本比 5.4
更新
好的,我可以再多解释一下为什么我问:
我使用的是 ganon.php 这是一个开源的 html dom 解析器。
它使用类似 $html_node('child_tag') 的语法来 return 另一个 child $html_node 其中 $html_node 是一个 object class HTML_NODE 的实例。所以我在想是否可以使用链接在嵌套的 html dom 结构中进行选择。
对于 PHP 版本 7.0.0 - 7.0.4
你可以像
一样使用它
class A{
public function __invoke($x){
return __FUNCTION__."$x";
}
}
echo (new A())(2);
输出:
__invoke2
我不认为你描述的行为实际上有效,即使在 PHP/7:
class A{
public function __invoke($arg){
echo __METHOD__ . "($arg) called" . PHP_EOL;
}
}
$a = new A();
$a(0);
$a(1)(2)(3);
A::__invoke(0) called
A::__invoke(1) called
Fatal error: Function name must be a string
(demo)
您可能对 variable functions 功能感到困惑。如果 foo()
return 是一个 'bar' 字符串,那么 foo()()
等于 bar()
:
class A{
public function __invoke(){
return 'hello';
}
}
function hello($name) {
echo "Hello, $name!" . PHP_EOL;
}
$a = new A();
$a()('Jim');
Hello, Jim!
(demo)
只要你的函数 return 更多具有有效函数名称的字符串,你就可以链接它,但 __invoke
和 class 都没有发挥任何相关作用:
function one() {
return 'two';
}
function two() {
return 'three';
}
function three() {
return 'four';
}
function four() {
echo 'Done!';
}
$a = one()()()();
Done!
(demo)
注意:以上所有代码片段都需要 PHP/7,但只需使用适当的括号和中间变量,就可以用早期版本模拟它们。
根据 UlrichEckhardt 的评论更新: 我忽略了 return class A 本身 评论的一个实例.如果您真的这样做了,代码 确实 有效:
class A{
public function __invoke($arg){
echo __METHOD__ . "($arg) called" . PHP_EOL;
return $this;
}
}
$a = new A();
$a(0);
$a(1)(2)(3);
class A{
public function __invoke($arg){
echo __METHOD__ . "($arg) called" . PHP_EOL;
return $this;
}
}
$a = new A();
$a(0);
$a(1)(2)(3);
(demo)
当然,这是PHP/7语法。对于旧版本,你需要辅助变量来打破魔法:
$a = new A();
$b = $a(1);
$c = $b(2);
$d = $c(3);
$d(4);
例如,我有以下内容:
class A{
__invoke(){
// return an instance of class A itself
}
}
那么我可以做以下事情吗?
new A()()()()... or (new A())()()()...
这里的解释是什么? 假设 PHP 版本比 5.4
更新好的,我可以再多解释一下为什么我问: 我使用的是 ganon.php 这是一个开源的 html dom 解析器。 它使用类似 $html_node('child_tag') 的语法来 return 另一个 child $html_node 其中 $html_node 是一个 object class HTML_NODE 的实例。所以我在想是否可以使用链接在嵌套的 html dom 结构中进行选择。
对于 PHP 版本 7.0.0 - 7.0.4
你可以像
class A{
public function __invoke($x){
return __FUNCTION__."$x";
}
}
echo (new A())(2);
输出:
__invoke2
我不认为你描述的行为实际上有效,即使在 PHP/7:
class A{
public function __invoke($arg){
echo __METHOD__ . "($arg) called" . PHP_EOL;
}
}
$a = new A();
$a(0);
$a(1)(2)(3);
A::__invoke(0) called
A::__invoke(1) called
Fatal error: Function name must be a string
(demo)
您可能对 variable functions 功能感到困惑。如果 foo()
return 是一个 'bar' 字符串,那么 foo()()
等于 bar()
:
class A{
public function __invoke(){
return 'hello';
}
}
function hello($name) {
echo "Hello, $name!" . PHP_EOL;
}
$a = new A();
$a()('Jim');
Hello, Jim!
(demo)
只要你的函数 return 更多具有有效函数名称的字符串,你就可以链接它,但 __invoke
和 class 都没有发挥任何相关作用:
function one() {
return 'two';
}
function two() {
return 'three';
}
function three() {
return 'four';
}
function four() {
echo 'Done!';
}
$a = one()()()();
Done!
(demo)
注意:以上所有代码片段都需要 PHP/7,但只需使用适当的括号和中间变量,就可以用早期版本模拟它们。
根据 UlrichEckhardt 的评论更新: 我忽略了 return class A 本身 评论的一个实例.如果您真的这样做了,代码 确实 有效:
class A{
public function __invoke($arg){
echo __METHOD__ . "($arg) called" . PHP_EOL;
return $this;
}
}
$a = new A();
$a(0);
$a(1)(2)(3);
class A{
public function __invoke($arg){
echo __METHOD__ . "($arg) called" . PHP_EOL;
return $this;
}
}
$a = new A();
$a(0);
$a(1)(2)(3);
(demo)
当然,这是PHP/7语法。对于旧版本,你需要辅助变量来打破魔法:
$a = new A();
$b = $a(1);
$c = $b(2);
$d = $c(3);
$d(4);