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. 如何檢查一個Javascript函數是否是構造函數
- 4. 如何檢測JavaScript(ES6)類是否具有非默認構造函數?
- 5. 如何檢測瀏覽器是否支持URL()構造函數?
- 6. 如何知道某個類是否有析構函數
- 7. 檢查類構造函數是否擴展了另一個類
- 8. 如何檢查java類是否包含默認構造函數
- 9. 使用檢測成語來確定某個類型是否具有特定簽名的構造函數
- 10. 檢查構造函數是否在ES6中繼承另一個構造函數
- 11. 是否有可能在構造函數中調用函數? PHP
- 12. 檢測構造函數中是否爲空白
- 13. 檢測編譯時是否存在默認構造函數
- 14. 如果子類不定義構造函數,是否調用父構造函數?
- 15. 是否有可能將構造函數放在另一個構造函數的構造函數中?
- 16. 構造函數是否有StoreStore障礙?
- 17. 在PHP中,是否有可能返回一個類的構造函數?
- 18. 如何測試一個case類構造函數的參數?
- 19. 如何檢查DOM節點是否從構造函數繼承?
- 20. 是否有可能測試一個javascript函數是否是一個構造函數?
- 21. 私人類的構造函數是否必須是私有的?
- 22. 如何讓父類構造函數在子構造函數之前運行? (PHP)
- 23. 如何檢查構造函數是否在C++中具有特定參數
- 24. [C++]構造函數不檢測組件
- 25. 檢測構造函數(符號) - ES6
- 26. 檢測工作CustomEvent構造函數
- 27. .Net如何爲分部類構造一個構造函數?
- 28. 類有不止一個構造函數
- 29. Java:Object類有一個構造函數嗎?
- 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