PHP调用父类方法

时间:2018-05-22 13:15:18

标签: php polymorphism

class Foo {
    protected static $a = 1;
    protected $b = 2;

    public function func() { return 'foo' . static::$a . $this->b; }
}
class Bar extends Foo {
    protected static $a = 3;
    protected $b = 4;

    public function func() { return 'bar' . static::$a . $this->b; }
}

$obj = new Bar();
$obj->func(); // returns of course 'bar34'

PHP中是否有任何选项可以从Foo类调用func()? 在C ++中,我会将$ obj转换为Foo并简单地调用func()

Bar* obj = new Bar();
Foo* obj2 = (Bar*) obj;
obj2->func(); // returns 'foo14';

4 个答案:

答案 0 :(得分:1)

这不是我所说的漂亮,但它的工作原理与您对C ++的描述相似;它的工作原理是调用get_parent_class(),然后滥用PHP从字符串创建对象的能力。

<?php

class Foo {
    public function func() { echo 'foo'; }
}
class Bar extends Foo {
    public function func() { echo 'bar'; }
}

$obj = new Bar();
$obj->func(); // Prints 'bar'

$parentClassString = get_parent_class($obj);
$newObj = new $parentClassString; // Gotta love PHP for magic like this
$newObj->func(); // Prints 'foo'

请参阅this snippet以了解相关信息。

修改

这是很多工作,但你可以使用所谓的Late Static Binding,或许在Jokerius's answer here中更清楚地解释。这要求你编写一堆自定义代码,我认为这不是优先考虑的。总的来说,简短的回答似乎是:它确实不可能。

答案 1 :(得分:1)

这对我来说看起来像是一个设计问题。 但是,如果我以一种易于阅读且不重新考虑我的设计的方式处理这个问题,我会这样做:

<?php
class Foo {
    public function func() { return 'foo'; }
}
class Bar extends Foo {
    public function func() { return 'bar'; }
    public function parentFunc() { return parent::func(); }
}

$obj = new Bar();
$obj->parentFunc(); // returns of course 'foo'

Loek的答案也有效,但不会在父对象上调用该方法。它只是在类parent上调用方法。这一切都取决于您正在寻找的功能。

您还可以执行以下操作:

<?php
class Foo {
    public function func() { return 'foo'; }
}
class Bar extends Foo {
    public function func($parent = false) { 
        if ($parent) {
            return parent::func();
        }
        return 'bar';
    }
}

$obj = new Bar();
$obj->func(true); // returns of course 'foo'

哪个相似但不需要额外的方法。

就个人而言,我觉得这个问题可能需要重新考虑代码设计而不是编码解决方案。

- 编辑 -

为了详细说明'重新思考代码设计',我会问自己“为什么我需要一个具有相同名称但功能不同的两种方法的对象?这不是两个不同对象的工作吗?跟踪向后发出问题直到找到设计问题。或者需要决定框架需要哪个对象。

答案 2 :(得分:1)

如果你想沉迷于反射,那么它是可能的,但我坚决认为这不应该在任何生产代码附近使用。如果你有一个子类的实例,那么你有一个理由,如果它被覆盖了一个父方法,那么这也是因为一个原因。

假设您已经知道所有这些,那么在免责声明的情况下,这应该适用于任何远程最新版本的PHP:

class Foo { public function func() { echo 'I am the parent'; } }
class Bar extends Foo { public function func() { echo 'I am the child'; } }

// Create instance of child class
$bar = new Bar;

// Create reflection class
$reflected = new ReflectionClass(get_class($bar));

// Get parent method
$method = $reflected->getParentClass()->getMethod('func');

// Invoke method on child object
$method->invokeArgs($bar, []);

// I am the parent

请参阅https://3v4l.org/NP6j8

答案 3 :(得分:0)

我不知道它应该对你有所帮助,但尝试在Bar class

中添加此功能
var y = thisComp.layer("smile").position[1];
var dist = Math.sqrt( Math.pow((this.position[0]-this.position[0]), 2) + Math.pow((this.position[1]-y), 2) );

newValue = dist ;
xScale = newValue;
yScale = newValue;
[xScale,yScale]

并致电

public function callParent($function){
    return parent::$function();
}

[增订] 你也可以自己编写演员表 像这样的东西

echo $obj->callParent("func");