24

我有模特

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
4

6 回答 6

46

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

如果您了解原因(否则请阅读下文),并且您确实知道自己在做什么,那么没有理由不提供该功能:

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

这将允许您稍后将软件中的任何用户对象替换为用户的子对象。这很重要,因为您希望随着时间的推移更改您的软件。

如果您将内部细节作为公共界面的一部分,那么您就是在剥夺自己保持灵活性的可能性。不灵活确实是一种糟糕的情况。

于 2012-08-06T12:55:32.227 回答
7

也许试试这个

parent::delete();
于 2012-08-06T12:42:15.890 回答
4

我认为您正在寻找 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 函数。

于 2012-08-06T12:42:19.063 回答
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
于 2012-08-06T12:56:38.740 回答
2

可以使用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
于 2019-08-04T15:39:26.617 回答
1

我在codingforums上找到了这个帖子。它所说的(我倾向于同意他们的观点)是,如果您在子类中有重写的函数/方法,则该对象的实例将始终调用子方法。

parent关键字类似于$thisor并且self只能从类本身中调用。

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

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

它只调用父方法。

于 2012-08-06T12:59:39.447 回答