我想实现一个钩系统在我简单的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()
这是最好的留给私人的,恕我直言。
我怎样才能让记录呼吁类从记录继承的私有方法?
添加一个虚拟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();
}
}
检查错误消息
Call to private method Payment::before_save() from context 'Record'
这意味着,你正在试图调用中定义的功能Payment
,而你是内Record
。 类Record
不具有before_save
方法,因为它是进一步向上继承链比函数被定义在哪里。
自从换句话说,父子关系是Record (is parent of) Payment
, Payment
访问Records
功能(由于从父继承的),但不反之亦然(父母不能“继承”子类的功能)。 你可以让你的保护功能,这将给它的访问上下继承链,但是你可能要重新考虑架构,如果你希望它这样..理想情况下,你应该有定义的函数决定Record
,并在它覆盖Payment
同时,(我可能是错与此),但明确检查method_exists
,除非你正在创建一个真正的动态系统中运行时类可以重叠和/或产生通常不需要。 如果定义了从地面行动的一类为基础的系统,你知道你是如何拼接起来的各个部分,通常你就不需要在运行时,如果检查method_exists
...只是一个想法..
变更范围的保护:
http://php.net/manual/en/language.oop5.visibility.php
类测试{
private function pri($val){
return $val;
}
function caller(){
return $this->pri(5);
}
}
$ testobj =新的考验; 回声$ testobj->呼叫者();
您将获得5作为输出。
通过这种方式,您可以访问类的私有函数。