PHP 构造方法 __construct()
PHP 构造方法 __construct() 允许在实例化一个类之前先执行构造方法。
构造方法
构造方法是类中的一个特殊方法。当使用 new 操作符创建一个类的实例时,构造方法将会自动调用,其名称必须是 __construct() 。
在一个类中只能声明一个构造方法,而是只有在每次创建对象的时候都会去调用一次构造方法,不能主动的调用这个方法,所以通常用它执行一些有用的初始化任务。该方法无返回值。
语法:
function __construct(arg1,arg2,...) { ...... }
例子:
<?php class Person { var $name; var $age; //定义一个构造方法初始化赋值 function __construct($name, $age) { $this->name=$name; $this->age=$age; } function say() { echo "我的名字叫:".$this->name."<br />"; echo "我的年龄是:".$this->age; } } $p1=new Person("张三", 20); $p1->say(); ?>
运行该例子,输出:
我的名字叫:张三 的年龄是:20
在该例子中,通过构造方法对对象属性进行初始化赋值。
提示
PHP 不会在本类的构造方法中再自动的调用父类的构造方法。要执行父类的构造方法,需要在子类的构造方法中调用 parent::__construct() 。
PHP 析构方法 __destruct()
PHP 析构方法 __destruct() 允许在销毁一个类之前执行执行析构方法。
析构方法
与构造方法对应的就是析构方法,析构方法允许在销毁一个类之前执行的一些操作或完成一些功能,比如说关闭文件、释放结果集等。析构函数不能带有任何参数,其名称必须是 __destruct() 。
语法:
function __destruct() { ...... }
我们在上面的例子中加入下面的析构方法:
//定义一个析构方法 function __destruct() { echo "再见".$this->name; }
再次运行该例子,输出:
我的名字叫:张三 我的年龄是:20 再见张三
提示
- 和构造方法一样,PHP 不会在本类中自动的调用父类的析构方法。要执行父类的析构方法,必须在子类的析构方法体中手动调用 parent::__destruct() 。
- 试图在析构函数中抛出一个异常会导致致命错误。
- 在 PHP4 版本中,构造方法的名称必须与类名相同,且没有析构方法。
在php中,子类extends继承了父类,当子类和父类同时存在构造函数__construct先执行哪一个呢? 80
在php中,子类extends继承了父类,当子类和父类同时存在构造函数__construct先执行哪子类的构造函数还是父类的构造函数呢? 还有一个问题就是:子类既然已经继承了父类,那么为什么还要用parent::__construct来调用父类的 构造函数呢? 我的意思是既然子类继...展开最佳答案
PHP5.0 以上版本对类的功能进行了很大的扩充。类的构造函数统一命名为__construct()。
子类的构造函数名也是__construct()(也是废话)。
在子类里父类的构造函数会不会执行,分两种情况:
1,如子类不定义构造函数 __construct(),则父类的构造函数默认会被继承下来,且会自动执行。
2,如子类定义了构造函数 __construct(),因为构造函数名也是__construct(),所以子类的构造函数实际上是覆盖(override)了父类的构造函数。这时执行的是该子类的构造函数。
所以子类在继承父类后,会拥有父类的属性和方法,这是继承的特性。子类在构造函数会首先调用父类的构造函数来实例化父类的属性,然后调用子类的构造函数,一般你不写,并不表示没有调用,而是首先调用了父类的无参构造函数,如果父类的某些属性需要在父类构造函数中特殊实例化,则你必须显示的调用父类的有参构造函数,这样保证子类属性的完整性。追问大师, 子类的构造函数覆盖了父类的构造函数,那么父类的__construct()被覆盖了应该不存在呢。然后parent::__construct怎么又可以调用呢
追答当子类写了构造函数,那么子类的构造函数就会覆盖父类的构造函数。如果子类没有写构造函数,而是parent::__construct这样的话只会继承父类的,而不会覆盖父类。 如果是想既继承父类的构造函数又想写自己的构造函数,那么就用parent::__construct,如果不想继承父类的构造函数,那就子类重新定义一个构造函数吧。
转载请注明出处:
未经允许不得转载:lxfamn » PHP 构造方法 __construct()