如何从子实例调用父函数?

时间:2012-08-06 12:39:54

标签: php doctrine

我有模特

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

6 个答案:

答案 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()删除对象,并且您也可以从父级调用de​​lete方法,因为您没有覆盖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关键字类似于$thisself,只能在类本身内调用。

如果您希望子对象能够调用父方法,只需创建另一个方法

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'));