gpt4 book ai didi

php - 如果存在则调用子类的 __call 方法,如果不存在则抛出异常

转载 作者:可可西里 更新时间:2023-11-01 00:48:14 25 4
gpt4 key购买 nike

[edit] 更新了标题以更准确地反射(reflect)问题

我要解决的问题是:我需要知道是否通过 parent:: 调用了一个方法,虽然我可以使用 debug_backtrace ,但它似乎在那里一定是执行此操作的更好方法。

我一直在研究后期静态绑定(bind),但也许我对它的理解不够深入,无法找到解决方案。

有问题的方法是 __call,所以我不能简单地传入一个额外的参数,因为它的错误是多于或少于恰好两个。

试图解决这个问题的原因是父类有__call 但子类可能有也可能没有_call。如果 child 没有,并且 parent 没有派发电话,那么我想抛出异常或错误。如果 child 确实有该方法,那么我将返回 false(不,我们没有处理这个)并让 child _call 方法继续。

到目前为止,我唯一可行的解​​决方案是让子调用 parent::__call 包装在一个 try/catch block 中,如果它没有路由请求,则默认情况下让父抛出异常。

即。

class Parent {
public function __call( $method, $params ) {
if( preg_match( $this->valid, $method ) {
$this->do_stuff();
// if child has a call method, it would skip on true
return true;
}
elseif( ** CHILD HAS CALL METHOD ** ) {
// this would let the child's _call method kick in
return false;
}
else {
throw new MethodDoesNotExistException($method);
}
}
}

class Child extends Parent {
public function __call( $method, $params ) {
if( ! parent::__call( $method, $params ) ) {
do_stuff_here();
}
}
}

虽然如果父级不处理该方法会抛出异常,但我只是想看看是否有更优雅的解决方案,因为使用异常进行流控制似乎不太正确。但也没有使用堆栈跟踪来找出调用者。

最佳答案

这应该在你的父类中做:

if (__CLASS__ != get_class($this))

关于php - 如果存在则调用子类的 __call 方法,如果不存在则抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13365625/

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