从继承的类调用私有方法(Call private method from inherited cla

2019-09-23 01:21发布

我想实现一个钩系统在我简单的ORM,在PHP中:

class Record {
  public function save() {
    if (method_exists($this,"before_save")) {
      $this->before_save();
    }
    //...Storing record etc.
  }
}

class Payment extends Record {
  private function before_save() {
    $this->payed_at = time();
  }
}

$payment = new Payment();
$payment->save();

这导致一个致命错误:

致命错误:调用私有方法付款::从上下文“记录” before_save()

说得通。

我可以改变的范围,公开的,但是这似乎丑陋:没有人,但付款有什么关系before_save() 这是最好的留给私人的,恕我直言。

我怎样才能让记录呼吁类从记录继承的私有方法?

Answer 1:

添加一个虚拟before_save功能,以您的Record类,设置其平易的保护。 现在,继承所有类Record都会有这样的功能,如果他们不覆盖它,它不会做任何事情。 如果他们覆盖它,它可以实现所需的功能。

class Record {
  public function save() {
    $this->before_save();
    //...Storing record etc.
  }

  protected function before_save() {
     return;
  }
}

class Payment extends Record {
  protected function before_save() {
    $this->payed_at = time();
  }
}


Answer 2:

检查错误消息

Call to private method Payment::before_save() from context 'Record'

这意味着,你正在试图调用中定义的功能Payment ,而你是内Record 。 类Record不具有before_save方法,因为它是进一步向上继承链比函数被定义在哪里。

自从换句话说,父子关系是Record (is parent of) PaymentPayment访问Records功能(由于从父继承的),但不反之亦然(父母不能“继承”子类的功能)。 你可以让你的保护功能,这将给它的访问上下继承链,但是你可能要重新考虑架构,如果你希望它这样..理想情况下,你应该有定义的函数决定Record ,并在它覆盖Payment

同时,(我可能是错与此),但明确检查method_exists ,除非你正在创建一个真正的动态系统中运行时类可以重叠和/或产生通常不需要。 如果定义了从地面行动的一类为基础的系统,你知道你是如何拼接起来的各个部分,通常你就不需要在运行时,如果检查method_exists ...只是一个想法..



Answer 3:

变更范围的保护:

http://php.net/manual/en/language.oop5.visibility.php



Answer 4:

可见性和继承在PHP中的规则:

委员声称:保护只能在类本身,并通过继承和父类访问



Answer 5:

类测试{

private function pri($val){
    return $val;
}

function caller(){
   return $this->pri(5);
}

}

$ testobj =新的考验; 回声$ testobj->呼叫者();

您将获得5作为输出。

通过这种方式,您可以访问类的私有函数。



文章来源: Call private method from inherited class