在PHP中,讓我們有四個類A,B,C和D.它們都沒有繼承其他類。他們都是獨立的班級。現在,我只想讓B和C能夠創建類A的對象。D不應該能夠創建類A的對象。如何允許在PHP中只對特定類創建類的對象?
這可以在PHP中完成嗎?如果是這樣,怎麼樣?我嘗試刷新我的面向對象的概念,但似乎無法在PHP中找到合適的答案。
小小的幫助將不勝感激。
在PHP中,讓我們有四個類A,B,C和D.它們都沒有繼承其他類。他們都是獨立的班級。現在,我只想讓B和C能夠創建類A的對象。D不應該能夠創建類A的對象。如何允許在PHP中只對特定類創建類的對象?
這可以在PHP中完成嗎?如果是這樣,怎麼樣?我嘗試刷新我的面向對象的概念,但似乎無法在PHP中找到合適的答案。
小小的幫助將不勝感激。
我想這裏功能debug_backtrace會幫助你。看下面的例子。
class A
{
public function __construct()
{
echo debug_backtrace()[1]['class'];
}
}
class B
{
public function createObj()
{
$obj = new A();
}
}
class C
{
public function createObj()
{
$obj = new A();
}
}
class D
{
public function createObj()
{
$obj = new A();
}
}
$o = new B();
$o->createObj(); //echo B
$o = new C();
$o->createObj(); //echo C
$o = new D();
$o->createObj(); //echo D
這裏上課A
您可以根據您的要求把病情__construct
。
但恕我直言的繼承和抽象是更好的選擇任務。
這看起來好像是工作,是@arkascha在他的回答中指出的。我會試試看,然後回來。 –
PHP沒有提供任何明確的限制手段。
雖然這個問題(爲什麼人會想這樣做?)聽起來很奇怪,我在這裏我可以想像兩種可能的方法,既嚴重缺點:
你可以嘗試限制訪問類定義: 在能夠實例化某個類的對象之前,必須知道類定義。兩種策略用於:
a)顯式包含語句在需要時加載類定義。這顯然可以通過基礎系統來阻止。無論是通過粗暴的權限拒絕,所以如果你玩弄文件權限,雖然這會導致運行時錯誤。或者通過替換實際文件,例如使用根據需要更改的符號鏈接級聯。
b)一些自動加載機制。這種情況顯然允許實現額外的過濾步驟,可能會加載一些虛假的類定義,或者只是在拒絕訪問目標類時拋出錯誤。
您可以主動防止對象創建。再次兩個變體:
a)在類構造函數內拋出異常。一個非常粗魯的事情要做...
b)按照工廠模式並聲明類的構造函數是非公開的,只提供靜態生成器方法作爲實例化類的對象的唯一方法。這是更透明的方法可以引發異常或拒絕返回預期的結果。
爲此,您顯然需要一些信息,您可以決定是否允許請求。應該可以評估執行堆棧以檢測觸發對象創建的代碼段。對這些信息進行詞法分析或與某個目錄進行比較可能構成決策的基礎。
但正如開頭所說:所有方法都有缺點。這聽起來更像是一種錯誤的可能性使用......雖然......可能性有待探索,對嗎? ;-)
感謝您的解釋。我將會討論你提到的第二點。而且由於我在這個領域的經驗不如你,你的第一點剛好超過了我的頭。爲了理解,您能否提供我可以閱讀的任何鏈接? –
你能否詳細說明在第一點你不瞭解的究竟是什麼? – arkascha
當你說「在能夠實例化某個類的對象之前必須知道類定義」之前,你是什麼意思? –
對於投票的人,請讓我知道爲什麼? –
我覺得函數'debug_backtrace()'會幫助你在這裏 –
@ChetanAmeta Ok Lemmi檢查出來。謝謝 –