PHP:如何检测某个类是否有构造函数?

时间:2009-12-09 07:03:41

标签: php

我如何检测某个类中是否有构造函数方法?例如:

function __construct()
{
}

4 个答案:

答案 0 :(得分:6)

我想是method_exists

答案 1 :(得分: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 has constructor”,并且在创建g的新实例时也会导致致命错误。因此,构造函数的唯一存在并不一定意味着您将能够创建它的新实例。 create function当然可以每次都返回相同的实例(从而使它成为单例)。

答案 2 :(得分:4)

有几种方式,这取决于你正在寻找什么。

method_exists()会告诉您方法是否已为该类声明。但是,这并不一定意味着该方法可调用 ...它可以是受保护的/私有的。单身经常使用私人建筑师。

如果这是一个问题,您可以使用get_class_methods(),并检查结果为“__construct”(PHP 5样式)或类名称(PHP 4样式),仅作为get_class_methods返回可以从当前上下文调用的方法。

答案 3 :(得分:1)

Reflection API公开isInstantiable()

  $reflectionClass = new ReflectionClass($class);
  echo "Is $class instantiable?  ";
  var_dump($reflectionClass->IsInstantiable());