我的代码是这样的:
<?php
class A {
public function CallA()
{
echo "callA" . PHP_EOL;
}
public static function CallB()
{
echo "callB" . PHP_EOL;
}
public static function __callStatic($method, $args)
{
echo "callStatic {$method}";
}
}
A::CallA();
但它会回显:
Strict Standards: Non-static method A::CallA() should not be called statically in /vagrant/hades_install/public/test.php on line 21
callA
也就是说,
CallA
没有碰到函数__callStatic
如果我想使用
__callStatic
调用A::CallA()
,该怎么办 最佳答案
正如documentation解释的那样:
您的代码中的方法CallA()
是可以访问的,这就是为什么PHP不使用__callStatic()
并直接调用CallA()
是唯一的选择的原因。
您可以通过使__callStatic()
不可访问(重命名或将其可见性更改为CallA()
或protected
)或直接调用(丑陋的解决方法)来强制private
的调用:
A::__callStatic('CallA', array());
如果选择保护
CallA()
,则需要实现 __call()
方法才能再次调用CallA()
:class A {
protected function CallA()
{
echo "callA" . PHP_EOL;
}
public static function CallB()
{
echo "callB" . PHP_EOL;
}
public static function __callStatic($method, $args)
{
echo "callStatic {$method}" . PHP_EOL;
}
public function __call($method, $args)
{
if ($method == 'CallA') {
$this->CallA();
}
}
}
A::CallA();
A::__callStatic('CallA', array());
$x = new A();
$x->CallA();
它输出:
callStatic CallA
callStatic CallA
callA
关于php - 如果存在非静态函数,则__callStatic不调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31039380/