zend_uint ce_flags TSRMLS_DC) /* {{{ */
28 //
调用
29 zend_register_functions(class_entry, class_entry->builtin_functions, &class_entry-
>function_table, MODULE_PERSISTENT TSRMLS_CC);
30
31 //zend_API.c 1795
行
32 /* Look for ctor, dtor, clone
33 * If it's an old-style constructor, store it only if we don't have
34 * a constructor already.
35 */
36 if ((fname_len == class_name_len) && !memcmp(lowercase_name, lc_class_name,
class_name_len+1) && !ctor) {
37
ctor = reg_function;
38 } else if ((fname_len == sizeof(ZEND_CONSTRUCTOR_FUNC_NAME)-1) && !
memcmp(lowercase_name,
ZEND_CONSTRUCTOR_FUNC_NAME,
sizeof(ZEND_CONSTRUCTOR_FUNC_NAME))) {
39
ctor = reg_function;
40 }
41
42 scope->constructor = ctor; //在 1961
行 确认构造函数
以上代码为 PHP 5.3.0 版本
从 以 上 跟 踪 流 程 来 看 , 程 序 在 注 册 所 有 函 数 时 , 如 果 存 在 __construct( 即
ZEND_CONSTRUCTOR_FUNC_NAME)时,会覆盖 class_name(类名)的构造函数,使其作
为常规的成员函数存在。如下所示代码:
43 <?php
44 class Foo {
45
46
public function Foo() {
47
echo 'Foo';
48
}
49
50
public function __construct() {
51
echo '__construct';
52
}
53 }
54
55 $foo = new Foo();
56 $foo->Foo();
对 于 在 前 面 的 示 例 中 的 报 错 , 我 们 可 以 在 zend/zend_object_handlers.c 1057 行
ZEND_API union _zend_function *zend_std_get_constructor(zval *object TSRMLS_DC)找到出
处。