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';
答案 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
答案 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");