我有模特
BaseUser.class.php
User.class.php
UserTable.class.php
在用户类中 我已经覆盖了删除功能
class User extends BaseUser {
function delete(){
}
}
现在,如果我想调用父删除功能......怎么样?
示例
$user = new User();
$user->delete(); // will call the overridden delete
$user-> ?? ; // want to call parent delete
答案 0 :(得分:34)
从技术上讲,这是不可能从“外部”(公共界面)出于合理的原因。
如果您已了解原因(另请参阅下文),并且您实际上知道自己在做什么,则没有理由不提供此功能:
class User extends BaseUser {
...
function parentDelete(){
parent::delete();
}
...
}
user = new User();
$user->delete(); // will call the overridden delete
$user->parentDelete(); // want to call parent delete
但是,如果你这样做,你应该知道你以某种方式滥用了继承。这一定是特殊的情况,因为我无法想象你真正需要这样做的任何情况。
因此,请尝试制定您需要该功能的原因,以便为自己提供更好的建议。
为什么那么糟糕?
原因很简单:在您的软件中,您不需要知道$user
是否有父母。这是你不应该关心的一些细节。
这将允许您稍后使用用户的子对象替换软件中的任何用户对象。这很重要,因为您希望随着时间的推移更改软件。
如果你制作公共界面的内部细节部分,那么你就是在掠夺自己保持灵活性的可能性。不灵活是一个非常糟糕的情况。
答案 1 :(得分:8)
也许试试这个
parent::delete();
答案 2 :(得分:3)
如果您需要一次呼叫父母,为什么需要延长delete
?
为什么不创建自定义删除?
像:
public function customDelete()
{
parent::delete();
// do extends delete here
}
然后您可以使用->customDelete()
删除对象,并且您也可以从父级调用delete方法,因为您没有覆盖delete()
方法:
$user = new User();
$user->customDelete(); // will call the overridden delete
$user->delete(); // will call the parent (since you didn't override it)
如果你真的需要覆盖delete()
函数,你仍然可以创建一种父删除:
public function parentDelete()
{
return parent::delete();
}
然后:
$user = new User();
$user->delete(); // will call the overridden delete
$user->parentDelete(); // will call the method that only call the parent
答案 3 :(得分:2)
我认为您正在寻找PHP parent函数:
<?php
class A {
function example() {
echo "I am A::example() and provide basic functionality.<br />\n";
}
}
class B extends A {
function example() {
echo "I am B::example() and provide additional functionality.<br />\n";
parent::example();
}
}
$b = new B;
// This will call B::example(), which will in turn call A::example().
$b->example();
?>
如果您的类没有名为getMyFunction()的函数,则调用$b->getMyFuction()
将调用父函数。如果是,它将调用子函数,除非子函数调用prent函数。
答案 4 :(得分:1)
我在编码论坛上找到了this thread。它所说的(我倾向于同意它们)是,如果你在子类中有一个重写的函数/方法,那么该对象的实例将总是调用子方法。
parent
关键字类似于$this
或self
,只能在类本身内调用。
如果您希望子对象能够调用父方法,只需创建另一个方法
function parentExample() {
parent::example();
}
仅调用父方法。
答案 5 :(得分:0)
可以使用didChangeNext
完成。是的,这是不好的做法,但有可能。
call_user_func
结果:
class BaseUser {
public function delete()
{
echo 'BaseUser deleted';
}
}
class User extends BaseUser{
public function delete()
{
echo 'User deleted';
}
}
$instance = new User();
call_user_func(array($instance, 'parent::delete'));