繁体   English   中英

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

[英]How to call parent function from instance of child?

我有模特儿

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

从技术上讲,这是不可能从“外部”(公共接口)有充分理由。

如果您已了解原因(另请参阅下文),并且您实际上知道自己在做什么,则没有理由不提供此功能:

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是否有父母。 这是你不应该关心的一些细节。

这样您就可以在以后用一个用户的子对象替换软件中的任何用户对象。 这一点非常重要,因为您希望随着时间的推移更改软件。

如果你制作公共界面的内部细节部分,那么你就是在掠夺自己保持灵活性的可能性。 不灵活是一个非常糟糕的情况。

也许试试这个

parent::delete();

如果需要一次呼叫父母,为什么需要扩展delete

为什么不创建自定义删除?

喜欢:

public function customDelete()
{
  parent::delete();

  // do extends delete here
}

然后你可以使用->customDelete()删除一个对象,你也可以从父->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

我认为你正在寻找PHP 函数:

<?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函数。

我在编码论坛上找到了这个帖子。 它所说的(我倾向于同意它们)是,如果你在子类中有一个重写的函数/方法,那么该对象的实例将总是调用子方法。

parent关键字类似于$thisself ,只能在类本身内调用。

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

function parentExample() { 
    parent::example(); 
}

它只调用父方法。

它可以使用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'));

结果:

BaseUser deleted

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM