【发布时间】:2012-11-25 16:26:43
【问题描述】:
我可以使用至少两种基本方法从子类访问受保护的类方法:
parent::myMethod();
$this->myMethod();
如果我不需要在子类中覆盖它,在这种情况下我必须这样做:
function myMethod() {
...
parent::myMethod();
...
}
哪个是最推荐的调用方式?我个人觉得使用 parent::myMethod() 而不是 $this->myMethod 更舒服,因为第一个立即告诉我这个方法正在被继承。但我不确定在性能和最佳实践方面采用哪种方式。
编辑:
检查一下,这是我的问题的真实情况。它使用 CodeIgniter,但即使你不熟悉它,你也可能会得到它:
class Admin_Controller extends CI_Controller {
protected function validate_form($validation) {
$this->load->library('form_validation');
// This will validate the form sent against the validation rules group specified in $validation
if ($this->form_validation->run($validation) == false) {
throw new Exception('There are errors in the form');
}
}
}
class Articles extends Admin_Controller {
function save($id) {
$this->validate_form(strtolower(get_class($this));
// OR
parent::validate_form(strtolower(get_class($this));
// Other actions
....
}
}
class Login extends Admin_Controller {
function signIn() {
$this->validate_form(strtolower(get_class($this));
// OR
parent::validate_form(strtolower(get_class($this));
// Other actions
....
}
}
【问题讨论】:
-
你的意思是它们都不被认为是不好的做法?
-
技术上讲
parent::myMethod()和$this->myMethod()是两个不同的东西,可能返回不同的结果……第二个是指子类。 -
...部分是什么?如果您不覆盖父方法,为什么需要其中任何一个?你能举一个更现实的例子吗? -
@Wesley Murch:是的,它们在技术上是不同的,因为 parent::myMethod() 是父类中的方法,而 this->myMethod() 是子类中的继承方法。但是,如果这个方法没有被覆盖,我能期待不同的结果吗?忽略'...'部分,这是我做的一个例子,以防我需要覆盖该方法,但事实并非如此。
-
但是,您正在在您的示例中覆盖
myMethod,并在您的孩子myMethod中调用父myMethod。尝试一个更好的例子,或者尝试以某种方式澄清你的问题,使其更具体或更现实。只调用父方法而不做任何修改是没有意义的。
标签: php codeigniter inheritance protected