2009-12-09 85 views
2

我該如何檢測某個類的構造方法?例如:PHP:如何檢測某個類是否有構造函數?

function __construct() 
{ 
} 
+0

我覺得__construct是PHP5的語法,而不是?也許應該糾正標籤然後(去除php4) – ChristopheD 2009-12-09 07:08:06

+1

爲什麼你需要知道?它不會影響創建新實例的能力。你可以隨時諮詢PHPDocs。 – Don 2009-12-09 07:10:56

+0

但如果該方法實際上是私人的,它會影響這種能力,但是我不知道如何檢查它。 – 2009-12-09 07:13:23

回答

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()); 
相關問題