我不認爲你可以做你要求的 - 不可能阻止一個變量被設置爲這樣。
但是,上面的評論讓我想到了。你說:
....主意,如果你想防止取消設置系統變量的第三方擴展
所以,如果我理解你的權利,你在這裏的目的是保證,而第三方代碼(即您的軟件)正在使用中,與它相關的所有變量是否仍然存在?
現在您還沒有詳細說明該系統中有哪些變量。我們在問題中看到一個對象,但是可能肯定還有比這更多的東西?我猜你已經有了一堆捆綁在一起的東西,對吧?這將有助於解決這些問題,以提供更多的背景;你所要求的實際情況是不可能的,但對你想達到的目標有一些瞭解,我們可以提出替代方案。
好的。所以我的建議是:創建你的對象作爲單身人士。這是純粹主義者經常皺起眉頭,但可能適用於這種情況,具體取決於你在做什麼。這裏的優點是你可以在類方法中封裝對象的所有訪問,這意味着使用你的代碼的開發人員無法訪問該對象的主副本以取消它。
一個單是這樣的:
<?php
class mySingletonClass {
private static $masterObject=null;
public static function getInstance() {
if(!isset(self::$masterObject)) {
self::$masterObject = new self;
}
return self::$masterObject;
}
private function __construct() {
//your existing constructor, as it already exists, but marked as private.
}
//...and all the other methods as you already have them.
}
類構造方法是私有的,所以只能從類中的方法訪問。因此,您不能再做new classname()
。你可以得到這個類的一個對象的唯一方法是從靜態的getInstance()
方法中獲取它。關鍵是這個方法總是返回對象的相同副本。
$obj = mySingletonClass::getInstance();
unset($obj);
$obj = mySingletonClass::getInstance(); //will give the exact same object as the first time.
如果需要,可以取消設置,但原始對象仍然存在,仍然可以訪問。任何其他類都可以使用該方法從程序中的任何位置獲取同一對象的相同副本。這是一個不可摧毀的全球變量。
單身人士通常用於程序的主數據庫連接對象,但它可能對您有用。
我希望有幫助。這是我能想到接近你想要的唯一方法。
@FoolishSeth - 我假設他使用'__unset()'魔術方法。 – Spudley
我剛剛意識到它可能在ArrayAccess實現中。 – FoolishSeth
爲什麼要防止頂級未設置?這似乎是一個危險和混亂的想法。 – FoolishSeth