这个在自己写的类中 需要function __construct(){
parent::__construct();
}继承父类构造函数

一开始,不怎么了解这个东西,所以最近想到了就来研究一下这个东西。

构造函数

 

首先,我就先说说php中的继承,__construct是类中的构造函数,用于实例化

PHP5可以在类中使用__construct()定义一个构造函数,具有构造函数的类,会在每次对象创建的时候调用该函数,因此常用来在对象创建的时候进行一些初始化工作。

当发生这个错误的时候,需要在构造函数中集成父类构造

 1 <?php   2     class Action{   3         public function __construct(){   4             echo 'Action';   5         }   6     }   7    8     class SonAction extends Action{   9         public function __construct(){  10             echo 'Son Action';  11         }  12     }  13   14     $son = new SonAction();  15   16     //result:Son Action  17 ?>

class Car {


在父类中定义构造函数,子类中使用构造函数,示例化子类,输出Son
Action,没有调用父类中的构造函数

   function __construct() {

<?php      class Action{          public function __construct(){              echo 'Action';          }      }        class SonAction extends Action{          public function __construct(){              parent::__construct();              echo 'Son Action';          }      }        $son = new SonAction();        //result:ActionSon Action  ?>

       print “构造函数被调用\n”;

在子类中,使用parent::__construct(),调用父类的构造函数,因为继承了父类,定义自己的构造方法,重载了__construct(),所以需要调用父类的构造函数,需要parent::__construct

   }

<?php      class Action{          public function __construct(){              echo 'Action';          }      }        class SonAction extends Action{        }        $son = new SonAction();        //result:Action  ?>

}

在继承的子类中没有自己的构造函数,可以说是继承了父类的构造函数(个人理解,可以探讨一下),所以实例化的时候,输出得到result

$car = new Car(); //实例化的时候 会自动调用构造函数__construct,这里会输出一个字符串

//接下来我说说_initialize 这个函数

 

其实这个函数不是原生php含有的,而是一个TP自己定义的一个函数

在子类中如果定义了__construct则不会调用父类的__construct,如果需要同时调用父类的构造函数,需要使用parent::__construct()显式的调用。

我们可以再TP的框架上看到,我的版本是3.1.3

 

   /**       * 架构函数 取得模板对象实例       * @access public       */      public function __construct() {          tag('action_begin',$this->config);          //实例化视图类          $this->view     = Think::instance('View');                     //控制器初始化          if(method_exists($this,'_initialize'))              $this->_initialize();      }

class Car {

这个函数是Action中的构造函数,在控制器初始化中,使用了method_exists,判断当前实例化的类中是否函数_initialize这个函数,

   function __construct() {

当子类没有构造函数的时候,子类继承父类的构造函数(子类会继承[或调用最近父类的构造函数]),判断子类中是否含有_initialize这个函数,

       print “父类构造函数被调用\n”;

若含有,调用函数,在构造的时候调用该函数,在construct之后。。。。。

   }

下面这个例子:可以仔细观察出来

}

 Action类的构造器      public function __construct() {          echo  'grand father';          tag('action_begin',$this->config);          //实例化视图类          $this->view     = Think::instance('View');                     //控制器初始化          if(method_exists($this,'_initialize'))              $this->_initialize();      }     TestAction类的构造器      class TestAction extends Action{                    public function __construct(){              echo 'Test override Action';          }      }      SonatestAction类初始化函数      class SontestAction extends TestAction{          public function _initialize(){              echo 'Son test';          }                    public function index(){              echo 222;              die();          }      }        //输出得到Test override Action222    

class Truck extends Car {

上面的例子得到结果分析可得到:
TestAction重载了Action中的构造器,所以访问SontestAction中的index的时候,首先会调用构造函数,则会调用父类的构造器,父类构造器中不含有调用_initialize所以。。。子类中没有调用_initialize

   function __construct() {

哪里有错误可以留言讨论。

       print “子类构造函数被调用\n”;

转载请注明转载地址,原创有毒,转载送菊花:

       parent::__construct();


   }

}

$car = new Truck();

 

析构函数

同样,PHP5支持析构函数,使用__destruct()进行定义,析构函数指的是当某个对象的所有引用被删除,或者对象被显式的销毁时会执行的函数。

class Car {

   function __construct() {

       print “构造函数被调用 \n”;

   }

   function __destruct() {

       print “析构函数被调用 \n”;

   }

}

$car = new Car(); //实例化时会调用构造函数

echo ‘使用后,准备销毁car对象 \n’;

unset($car); //销毁时会调用析构函数

当PHP代码执行完毕以后,会自动回收与销毁对象,因此一般情况下不需要显式的去销毁对象。

Author

发表评论

电子邮件地址不会被公开。 必填项已用*标注