2009-12-09 34 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()); 
相关问题