当前位置: 首页 > 工具软件 > Construct > 使用案例 >

__construct 和 _initialize的区别

邵君植
2023-12-01

__construct()是php内置的构造函数,__initialize()是php框架中定义的(如thinkphp),用法基本一致。

区别:

在tp中若父类和子类都有_initialize,则只调用子类的_initialize,并不会自动调用父类_initialize

而子类的__construct方法如果要调用父类的__construct方法,必须在子类构造函数显示调用parent::__construct();

 

1、__initialize()不是php类中的函数,php类的构造函数只有__construct().
2、类的初始化:子类如果有自己的构造函数(__construct()),则调用自己的进行初始化,如果没有,则调用父类的构造函数进行自己的初始化。
3、当子类和父类都有__construct()函数的时候,如果要在初始化子类的时候同时调用父类的__constrcut(),则可以在子类中使用parent::__construct().
如果我们写两个类,如下

class Action{
    public function __construct()
    {
        echo 'hello Action';
    }
}
 
class IndexAction extends Action{
    public function __construct()
    {
        echo 'hello IndexAction';
    }
}
 
$test = new IndexAction;
//output --- hello IndexAction

很明显初始化子类IndexAction的时候会调用自己的构造器,所以输出是'hello IndexAction'。
但是将子类修改为

class IndexAction extends Action{
    public function __initialize()
    {
        echo 'hello IndexAction';
    }
}

那么输出的是'hello Action'。因为子类IndexAction没有自己的构造器。
如果我想在初始化子类的时候,同时调用父类的构造器呢?

class IndexAction extends Action{
    public function __construct()
    {
        parent::__construct();
        echo 'hello IndexAction';
    }
}

这样就可以将两句话同时输出。
当然还有一种办法就是在父类中调用子类的方法

class Action{
    public function __construct()
    {
        if(method_exists($this,'hello'))
        {
            $this -> hello();
        }
        echo 'hello Action';
    }
}
 
class IndexAction extends Action{
    public function hello()
    {
        echo 'hello IndexAction';
    }
}

这样也可以将两句话同时输出。

(1)_initialize()函数是在任何方法执行之前,都要执行的,当然也包括_ _construct构造函数,注意,_ _construct这里是双划线,而_initialize()函数是单划线。
(2)如果父子类均有_initialize()函数,则子类覆盖了父类的,如果子类没有而父类有,则子类继承父类的。在调用子类对象的_initialize()时,不会导致自动调用父类的_initialize()。
(3)默认情况下,子类的构造函数也不会自动调用父类的构造函数,这一点与Java不同。实际编写子类的构造函数时,一般都要加上父类构造函数的主动调用parent::_ _construct(),否则会导致子类对象空指针的异常,如Call to a member function assign() on a non-object。
(4)_initialize()函数是在“任何”方法调用之前都要调用的,也就是说如果存在_initialize()函数,调用对象的任何方法都会导致_initialize()函数的自动调用,而_ _construct构造函数仅仅在创建对象的时候调用一次,跟其它方法调用没有关系。

 类似资料: