Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/285.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_Object_Overriding - Fatal编程技术网

Php 调用重写的父方法

Php 调用重写的父方法,php,object,overriding,Php,Object,Overriding,在下面的示例代码中,父类Foo中的方法test()被子类Bar中的方法test()覆盖。是否可以从Bar::test()调用Foo::test() (参见示例#3 at)在方法名称之前使用父项::,例如 parent::test(); 请看从您在pastebin上的评论判断,我认为您不能 也许如果你有这样的东西 class foo { public function foo($instance = null) { if ($instance) {

在下面的示例代码中,父类
Foo
中的方法
test()
被子类
Bar
中的方法
test()
覆盖。是否可以从
Bar::test()
调用
Foo::test()


(参见示例#3 at)

在方法名称之前使用
父项::
,例如

parent::test();

请看

从您在pastebin上的评论判断,我认为您不能

也许如果你有这样的东西

class foo {
    public function foo($instance = null) {
        if ($instance) {
            // Set state, etc.
        }
        else {
            // Regular object creation
        }
}
class foo2 extends foo {
    public function test() {
        echo "Hello, ";
        // New foo instance, using current (foo2) instance in constructor
        $x = new foo($this);
        // Call test() method from foo
        $x->test();
    }
}

调用父方法可能被认为是不好的做法或代码气味,并且可能表明编程逻辑可以在某种程度上得到改进,子方法不必调用父方法。提供了一个良好的通用描述

不调用父级的实现如下所示:

abstract class Foo
{
    $text = "world\n";

    public function test() {
        $this->test_child();
        echo $this->text;
    }

    abstract protected function test_child();
}// class Foo

class Bar extends Foo
{
    protected function test_child() {
        echo "Hello, ";
    }
}// class Bar extends Foo

$x = new Bar;
$x->test();

只需将可见性级别设置为$text属性

private$text=“world\n”;

请编辑您的问题以直接包含代码…您所说的
foo::test()REQUIRE_禁用$this中的对象数据是什么意思?
@Oli Charlesworth-我尝试了很多次,但我不知道如何正确执行,这就是为什么我使用pastebin:)您不能在PHP中重载方法,只能重写。检查顶部的注释部分:@kiler129:当您从对象上下文中使用parent::method()时,父方法仍然可以访问$this。您是对的-使用parent::from child类将引用对象并调用对象方法(而不是静态方法)。感谢帮助:)为什么不将所需参数从
$this
传递到
foo()
?(而不是整个thinh)他可以通过使用parent::test()作为前缀来引用test的父版本,如其他文章中所述。你可能想在下投票之前考虑删除。@ JeaReIS-在我的代码中几乎不可能使用这样的技巧,BCS对象有时重量只有几兆字节(它是一个服务器应用程序,而不是经典的Web脚本OFC)。这样做会导致高内存使用率。关于parent::test(),我的印象是无法静态调用该方法,因此我给出了答案。这只是一个建议,不知道具体细节,很难判断它是否可行。。。PHP作为[半]真正的目标语言非常年轻:)调用扩展类中可能存在或不存在的函数比重载函数和调用父函数更难闻。在您的示例中,我们必须确保子函数存在-您可能需要在子类中存根该函数,或者使用接口。如果一个父类根本不需要知道它的扩展子类,通常会更好。我想说,最好在子类中生成相同的函数,然后从那里调用
parent::function()
“调用扩展类中可能存在或不存在的函数”是什么意思?事实上,如果它是父类中的一个抽象方法,子类必须实现它,否则您将得到类似于
致命错误的东西,类Bar包含1个抽象方法,因此在尝试运行它时必须声明为抽象或实现其余方法(Foo::test_child)
。没有“可能”或“可能”。如果它是这样声明的,那么它将存在,或者代码将无法运行。它不能错过,它不是承诺或猜测,它是一个声明。“我想说,您最好在子类中创建相同的函数,然后从那里调用parent::function()”问题是,您无法强制子类调用parent方法。如果您在父方法中有任何关键的内容,并且子方法忘记调用它,那么这将导致运行时头痛,甚至很难检测到。但是,我的解决方案不让子函数决定是否调用父方法,如果子函数未能实现所需的方法,则这是一个编译时问题:自动声明自己并易于修复。我想这也取决于数据流-是否希望在调用父逻辑之前调用子函数,还是之后?这会影响谁给谁打电话,我想不是真的。对抽象方法的调用可以作为父方法的第一行或最后一行,或者甚至在中间,或者在条件、循环等中,覆盖所述用例,并且甚至在灵活性方面传递更多。
class foo {
    public function foo($instance = null) {
        if ($instance) {
            // Set state, etc.
        }
        else {
            // Regular object creation
        }
}
class foo2 extends foo {
    public function test() {
        echo "Hello, ";
        // New foo instance, using current (foo2) instance in constructor
        $x = new foo($this);
        // Call test() method from foo
        $x->test();
    }
}
abstract class Foo
{
    $text = "world\n";

    public function test() {
        $this->test_child();
        echo $this->text;
    }

    abstract protected function test_child();
}// class Foo

class Bar extends Foo
{
    protected function test_child() {
        echo "Hello, ";
    }
}// class Bar extends Foo

$x = new Bar;
$x->test();