background image

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)找到出
处。