2
A
回答
5
With method_exists我想?
5
function hasPublicConstructor($class) {
try {
$m = new ReflectionMethod($class, $class);
if ($m->isPublic()) {
return true;
}
}
catch (ReflectionException $e) {
}
try {
$m = new ReflectionMethod($class,'__construct');
if ($m->isPublic()) {
return true;
}
}
catch (ReflectionException $e) {
}
return false;
}
使用method_exists()可以有它的優點,但考慮下面的代碼
class g {
protected function __construct() {
}
public static function create() {
return new self;
}
}
$g = g::create();
if (method_exists($g,'__construct')) {
echo "g has constructor\n";
}
$g = new g;
這將輸出「G具有構造」,創造g的新實例時還會導致致命的錯誤。因此,構造函數的唯一存在並不一定意味着您將能夠創建它的一個新實例。創建函數當然可以每次都返回同一個實例(從而使其成爲一個單例)。
+1
此工作原理無需創建對象。 – 2009-12-09 07:36:53
3
有幾種方法,它有點取決於你尋找什麼。
method_exists()會告訴你,如果一個方法已被宣佈爲該類。但是,這並不一定意味着該方法是可調用 ...它可以被保護/私有。單身人士經常使用私人構造函數。
如果這是一個問題,你可以使用get_class_methods(),檢查結果爲不是「__construct」(PHP 5樣式)或類(PHP 4的風格)的名稱,get_class_methods
只返回從調用的方法當前的情況。
1
反射API暴露isInstantiable()
$reflectionClass = new ReflectionClass($class);
echo "Is $class instantiable? ";
var_dump($reflectionClass->IsInstantiable());
相關問題
- 1. 如何檢測一個類是否有移動構造函數?
- 2. 如何檢測Delphi類是否具有虛擬構造函數?
- 3. 檢測類是否具有帶簽名的構造函數
- 4. 如何檢查一個Javascript函數是否是構造函數
- 5. 如何檢測JavaScript(ES6)類是否具有非默認構造函數?
- 6. 如何檢測瀏覽器是否支持URL()構造函數?
- 7. 檢查類構造函數是否擴展了另一個類
- 8. 使用檢測成語來確定某個類型是否具有特定簽名的構造函數
- 9. 檢測構造函數中是否爲空白
- 10. 是否有可能將構造函數放在另一個構造函數的構造函數中?
- 11. 構造函數是否有StoreStore障礙?
- 12. 如何測試一個case類構造函數的參數?
- 13. 是否有可能測試一個javascript函數是否是一個構造函數?
- 14. 私人類的構造函數是否必須是私有的?
- 15. 如何讓父類構造函數在子構造函數之前運行? (PHP)
- 16. 如何檢查構造函數是否在C++中具有特定參數
- 17. [C++]構造函數不檢測組件
- 18. 有一個子類的構造函數
- 19. 是否有可能有一個構造函數的參數作爲類名C++?
- 20. 是否有可能超載在PHP構造函數
- 21. 是否有可能在PHP中鏈式重載構造函數?
- 22. 從構造函數中檢查子類中的函數是否存在?
- 23. 是否有與嵌套類關聯的構造函數
- 24. 在基類構造函數中使用`this`是否有效?
- 25. JUnit錯誤 - IllegalArgumentException:測試類只能有一個構造函數
- 26. 是否有一個靜態構造函數/析構函數幫助主題
- 27. 在Kotlin中有兩個不同構造函數的數據類構造函數
- 28. 一個類是否需要Typescript中的構造函數?
- 29. 如何讓類構造函數在Ruby中是私有的?
- 30. 類構造函數
我覺得__construct是PHP5的語法,而不是?也許應該糾正標籤然後(去除php4) – ChristopheD 2009-12-09 07:08:06
爲什麼你需要知道?它不會影響創建新實例的能力。你可以隨時諮詢PHPDocs。 – Don 2009-12-09 07:10:56
但如果該方法實際上是私人的,它會影響這種能力,但是我不知道如何檢查它。 – 2009-12-09 07:13:23