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