[英]Calling a child class function if not exist in parent class
我有一個類似下面的代碼-
class CartItem{
var $v;
function __construct(){
$this->f();
}
function f(){
echo 'In parent';
}
}
class m extends CartItem{
function f(){
echo 'In child';
}
}
new m();
現在,當創建m()的實例時...它沒有任何構造函數,因此它正在調用父類的構造函數。 現在在其中調用了函數f。
我想要的是-如果類m()具有定義的函數f()...,則應調用它而不是父類的函數f()。
但是無論如何,它都在調用父類函數,就像從父類的構造函數中調用的那樣,而與子類/上下文無關:(
您想在__construct()
調用該類中未定義的方法。 這表明CartItem
類是一個抽象概念,您不打算實例化它(因為CartItem
的實例可能不包含項目的足夠信息或行為)。
使用一個抽象類來實現一個抽象概念 ,該抽象類定義了盡可能多的抽象類 ,並定義了在擴展它的具體類中實現的抽象方法。 方法f()
是無法在抽象概念中定義的方法,而必須在擴展它的每個類中定義:
abstract class CartItem
{
public function __construct()
{
$this->f();
}
abstract protected function f();
}
class m extends CartItem
{
protected function f()
{
// Implement behaviour specific to this class
}
}
這實際上是一個非常有趣的問題。
因此,據我所知,您是在問( 如果這樣不對,請說 ):
您可以調用擴展父類的類的函數嗎?
是的,如果孩子中的方法是靜態的,則可以...
以這個例子為例(為了簡化示例,我沒有在構造函數中使用它,但是它也可以在其中使用):
class ClassA {
public function testMeAsWell() {
return ClassB::testMe();
}
}
class ClassB extends ClassA {
static function testMe() {
return 'do something';
}
}
$child = new ClassB();
echo $child->testMe();
// outputs 'do something'
$parent = new ClassA();
echo $parent->testMeAsWell();
// also outputs 'do something'
這項工作的原因需要更多的研究,但是我猜想是因為PHP是編譯的,因此它將在運行時了解這兩個類,因此可以弄清楚我們希望它做什么。
因此,進一步,您想使用變量。 是的,您可以,但是它們也必須是靜態的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.