![](/img/trans.png)
[英]Class inheritance - Calling properties and/or methods not in the parent class
[英]Calling Parent Class Methods
編輯問題以更好地反映我的需求。
請看以下示例:
class Base
{
public $Text = null;
public function __construct()
{
$this->Text = new Base_Text();
}
}
class Base_Text extends Base
{
public $Is = null;
public function __construct()
{
$this->Is = new Base_Text_Is();
}
public function CammelCase($string)
{
return trim(str_replace(' ', '', ucwords($string)));
}
}
class Base_Text_Is extends Base_Text
{
public function CammelCase($string)
{
return ($string === $this->CammelCase($string)); // doesn't work
}
}
如何在不靜態調用Base_Text類的情況下修復Base_Text_Is::CammelCase()
方法 (不使用parent::
或Base_Text::
?
我為這種情況提出的唯一解決方案是創建一個像這樣的單例函數:
function Base()
{
static $instance = null;
if (is_null($instance) === true)
{
$instance = new Base();
}
return $instance;
}
並將Base_Text_Is::CammelCase()
方法更改為:
return ($string === Base()->Text->CammelCase($string));
並且為了避免創建Base類的兩個對象實例,而不是:
$base = new Base();
$base->Text->Is->CammelCase('MethodOverloading'); // true
我只是做:
Base()->Text->Is->CammelCase('MethodOverloading'); // true
這是一個好習慣嗎? 還有其他解決方案嗎?
你問題的核心在於:
Son :: B()如何非靜態地調用Dad :: A()方法(不使用父或爸爸)?
答案很簡單,它不可以。 你用Son::A()
覆蓋了Dad::A()
Son::A()
。 Son對象現在擁有的唯一A()
概念是它自己的A()
。 您必須靜態地調用父方法,或者在完全不同的Dad
對象實例上調用父方法。
最重要的是,如果你想調用父A()
方法,為什么還要先打擾它?
你的結構也沒有任何意義。 你為什么要調用$dad->A()
將它傳遞給$dad->son->A()
,然后調用$dad->son->B()
,然后從那里調用你問,再次打電話給$dad->A()
? 這是一個無限循環。
除了確保不實例化多個父對象之外,你的單例方法似乎沒有提供任何真正的優勢,但事實是你仍然在實例化一個完全獨立的對象來執行聽起來應該在里面的邏輯班級,而不是外面。
如果沒有看到實際的邏輯和你想要完成的事情,很難知道應該推薦什么來避免這種循環依賴。 但是,我認為您可能想要分析您嘗試使用這些方法執行的操作,並可能重新設計繼承的工作方式。
編輯
我認為你的繼承權已經太多了。 你沒有理由這樣做:
$base = new Base();
$base->Text->Is->CammelCase('MethodOverloading'); // true
如果所有功能都在子類中,則不應該實例化Base
類。 它應該是這樣的:
$text = new Text();
$text->isCamelCase('someString');
您的代碼可以大大簡化,刪除所有循環父/子實例化,並將特定功能下推到子類:
class Base
{
//don't put anything related to child classes here,
//unless it is going to provide specific functionality
}
class Text extends Base
{
public function CamelCase($string)
{
return trim(str_replace(' ', '', ucwords($string)));
}
public function isCamelCase($string)
{
return ($string === $this->CamelCase($string));
}
}
我不認為有一種方法可以從子節點調用父方法,而不是靜態調用它或使用parent::
。 我可能會誤解這個問題。 創建Son()的實例不會創建兩個對象。 兒子延伸爸爸,但它仍然是一個對象。
如果你打算用Son中的Singleton打電話給Dad()那么為什么要從Son那里擴展呢?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.