我正在寻找一种包含魔法的特质__call().在测试期间,当使用特征的类的父类包含该__call方法时,我遇到了一个挑战.
trait SomeTrait {
public function __call($method, array $parameters) {
// ...
return parent::__call($method, $parameters);
}
}
Run Code Online (Sandbox Code Playgroud)
这会导致致命错误:当前类范围没有父级时,无法访问parent ::
我还根据其他一些答案尝试了以下内容:
return call_user_func_array([$this, '__call'], [$method, $parameters]);
Run Code Online (Sandbox Code Playgroud)
这会导致分段错误:11.我想是因为一个无限的调用循环.
如何__call从__call特征方法中调用父方法?
如果直接在特征内无法实现,那么我怎么能调用父__call方法呢?
Ari*_*ius 10
请检查以下代码:
trait SomeTrait
{
public function __call($method, array $parameters)
{
// ...
return is_callable(['parent', '__call']) ? parent::__call($method, $parameters) : null;
}
}
class GreatParentClass
{
public function __call($method, array $parameters)
{
return 'bar';
}
}
class ParenClassWithoutCall
{
}
class ProxyClass extends GreatParentClass
{
}
class FooClass extends ProxyClass
{
use SomeTrait;
}
class BarClass extends GreatParentClass
{
use SomeTrait;
}
class BazClass extends ParenClassWithoutCall
{
use SomeTrait;
}
class SomeClassWithoutParent
{
use SomeTrait;
}
$class = new FooClass();
var_dump($class->foobar());
$class = new BarClass();
var_dump($class->foobar());
$class = new BazClass();
var_dump($class->foobar());
$class = new SomeClassWithoutParent();
var_dump($class->foobar());
Run Code Online (Sandbox Code Playgroud)
这将打印:
string(3) "bar"
string(3) "bar"
NULL
NULL
Run Code Online (Sandbox Code Playgroud)
沙盒用代码检查:http: //3v4l.org/R8hI3
编辑:我认为这将涵盖所有可能性.
| 归档时间: |
|
| 查看次数: |
3126 次 |
| 最近记录: |