gpt4 book ai didi

php - 显式静态调用基类的成员函数

转载 作者:可可西里 更新时间:2023-11-01 12:38:19 25 4
gpt4 key购买 nike

我有一个基类,其中定义了魔术方法 __call_callStatic,以便处理对未声明成员函数的调用。

当你同时拥有非静态和静态的时,似乎无法从派生类中调用静态的,因为静态运算符 :: 并不隐式表示 static 如果与 parent 一起使用,或者在本例中为基类的名称。这是此处解释的特殊语法:http://php.net/manual/pl/keyword.parent.php

我想在这里做的是调用 __callStatic 的派生类,它失败了,因为调用默认为非静态调用并由 __call 处理。

如何对基类的成员函数进行显式静态调用?

<?php

class MyBaseClass {

public static function __callStatic($what, $args)
{
return 'static call';
}

public function __call($what, $args)
{
return 'non-static call';
}

}

class MyDerivedClass extends MyBaseClass {

function someAction()
{
//this seems to be interpreted as parent::Foo()
//and so does not imply a static call
return MyBaseClass::Foo(); //
}

}

$bar = new MyDerivedClass();
echo $bar->someAction(); //outputs 'non-static call'

?>

请注意,删除非静态 __call 方法会使脚本输出“静态调用”,因为 __callStatic 被调用,当 __call 是未声明。

最佳答案

为避免此类行为,您可以使用空代理类,它在运行时不链接 parentMyBaseClass:

class MyBaseClass {

public static function __callStatic($what, $args)
{
return 'static call ' . PHP_EOL;
}

public function __call($what, $args)
{
return 'dynamic call ' . PHP_EOL;
}
}

class ProxyClass extends MyBaseClass {
//"Empty" class
}

class MyDerivedClass extends MyBaseClass {

function someAction()
{
return ProxyClass::Foo();
}

}

$bar = new MyDerivedClass();
var_dump($bar->someAction()); //outputs 'static call'

http://pastebin.com/7JMJUmXt

关于php - 显式静态调用基类的成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11155553/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com