Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何从子实例调用父函数?_Php_Doctrine - Fatal编程技术网

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

Php 如何从子实例调用父函数?,php,doctrine,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->

我有一个模型

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
也许试试这个

parent::delete();

我认为您正在寻找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->getMyFunction()
将调用父函数。如果是,它将调用子函数,除非子函数调用prent函数。

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

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

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

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


如果你把内部细节作为公共界面的一部分,你就失去了保持灵活性的可能性。不灵活是一个很糟糕的情况。

如果你需要给家长打一次电话,为什么要扩展
删除

为什么不创建一个自定义删除

比如:

然后,您可以使用
->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();
}
然后:

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

parent
关键字类似于
$this
self
,只能从类本身内部调用

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

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

它只调用父方法。

可以使用
call\u user\u 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

我有user$user的对象如何调用这个对象?您必须在child中调用parent方法method@HUGO:你不能。从外面看,两者都是一样的。不是两个,而是一个对象。这就是继承的目的。我认为OP需要知道是否
$b->parent::example()
将起作用。@HUGO$b>example()将按以下方式执行:如果子类中没有
example()
,则将执行parent。如果子级中有函数
example()
,则它将改为执行。您是否尝试过
$user->parent::delete()?是的,我试过了,但没用。。。。netbeans将其显示为错误的语义当您在浏览器中运行代码时会怎么样?不要忘记:您的IDE只是一个有用的工具。这并不是“有效代码识别”的最终结果。换句话说,有时它会给出误报。看看@j0k的答案。它几乎涵盖了你所问的一切。我不同意“不好”的说法。就像接口描述对象方法的签名一样,当您
实现该接口时,当您
扩展父对象时,您应该非常清楚该父对象实现了什么。这是对象扩展的关键。这里没有“坏”字。除了:需要调用两个不同方法的想法。只要将
User:delete()
调用
parent::delete()
作为其方法的一部分即可。7岁。。。为什么我还要麻烦。。。是的,扩展的用户需要知道,但是该类型的“用户”必须不知道任何内部细节(只有公共接口)。很可能我的英语不是很精确,但是你的评论与我想在“坏”部分说的方向一致,我可能也应该提供一个好的例子,在扩展类的delete()方法中调用parent::delete()-呃,这是答案,它在上面。我自己的用例是:我有一个Mail()类,现在我需要一个DelayedMail()类来伪造发送邮件,但实际上在数据库中对电子邮件进行排队。伪造是通过重写send()方法完成的。排队的最简单方法是休眠实例并存储其表示形式。没问题!但后来,在cron作业中,我解冻了这些对象,现在想真正发送它们——此时我不能使用send(),因为那样会重新对它们进行查询。我需要使用父级的send(我称之为“actualSend()”)。我不认为这是对OOP的滥用,相反。这是解决原始海报试图解决的关键问题的最佳答案:公开继承类的自定义和非自定义函数,将子类更像一个包装器(供知道父接口如何工作的东西使用)而不是在不知道父结构的情况下使用不透明的新类。
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