编程语言
首页 > 编程语言> > php – 如果存在,则调用子clases’__ call方法,否则抛出异常

php – 如果存在,则调用子clases’__ call方法,否则抛出异常

作者:互联网

[edit]更新标题以更准确地反映问题

我试图解决的问题是:我需要知道是否通过parent ::调用方法,而我可以使用debug_backtrace,似乎必须有更好的方法来执行此操作.

我一直在研究后期的静态绑定,但也许我不太了解它能够深入了解解决方案.

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

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

到目前为止,我唯一可行的解​​决方案是让子调用parent :: __调用包装在try / catch块中,如果父路由器不路由请求,则默认情况下会抛出异常.

即.

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();
    }
  }
}

如果父进程没有处理该方法,则抛出异常,我只是想看看是否有更优雅的解决方案,因为使用flow-controll的异常似乎不太正确.但是也没有使用堆栈跟踪来找出调用者.

解决方法:

这应该在你的父类中做:

if (__CLASS__ != get_class($this))

标签:php,oop,magic-methods
来源: https://codeday.me/bug/20190901/1784237.html