陈力:传智播客古代 珍宝币 泡泡龙游戏开发第32讲:PHP 构造方法、析构方法
构造方法__construct()的主要作用是完成对新对象的初始化,没有返回值,析构方法__destruct的作用主要用于释放资源,this代表当前对象, 什么是php垃圾回收器等等。贵阳网站建设的朋友,必须要掌握这些知识。本节陈力:传智播客古代 珍宝币 泡泡龙游戏开发第32讲:PHP 构造方法、析构方法
一、PHP构造方法
什么是构造函数呢?在回答这个问题之前,我们来看一个需求:前面我们在创建人类的对象时,是先把一个对象创建好后,再给他的年龄和姓名属性赋值,如果现在要求,在创建人类的对象时,就指定这个对象的年龄和姓名,该怎么做?可以在定义类的时候,定义一个构造方法即可。
构造方法是类的一种特殊的方法,它的主要作用是完成对新对象的初始化。它有几个特点:①没有返回值。 ②在创建一个类的新对象时,系统会自动的调用该类的构造方法完成对新对象的初始化。
php4中构造函数名和类名一样:
class Cat{
修饰符 function Cat(参数列表){
//初始化操作
}
}
php5中不但支持php4中构造方法,同时还增加了另外一种方式:
class Cat{
修饰符 function __construct(参数列表){
//初始化操作
}}
现在就用构造方法来完成刚才提出的问题:
在创建人类的对象时,就指定这个对象的年龄和姓名,该怎么做?
修饰符 function __construct(参数列表){
//初始化操作
}
class Person{
public $name;
public $age;
public function __construct($i_name,$i_age){
//如果这里不使用$this->name ,而是 $name 这相当于在构造函数中
//定义了一个新的变量$name ,该变量和类的成员变量 $name是不同的两个变量
$this->name=$i_name;
$this->age=$i_age;
}
public function __construct(){
echo 'aa';
}
public function test(){
echo $this->name.' : '.$this->age;
}
//构造函数不能重载吗?[不能,不管使用php4,还是php5的方式都不能重载构造函数]
/* public function __construct($name){
$this->name=$name;
}*/
/* public function __construct(){
}*/
}
// $p1=new Person("大黄3",90);
// $p1=new Person("狼牙");
//一旦定义了一个构造函数,就没有默认的构造函数了
// $p1=new Person();
$p1->test();
(1)什么是this
系统会给每个对象分配 this,代表当前对象。坦白的讲,要明白this 不是件容易的事,我给大家打一个比方。
$this-> 属性名;
为了进一步理解this,我们再看一个案例 (this1.php)
class Person{
public $name;
public $age;
public function __construct($name){
$name=$name;
// $this->name=$name;
}
public function showInfo(){
echo 'name='.$this->name;
}
}
$p1=new Person("AAA");
echo $p1->name;
echo '<br/>'.$p1->showInfo();
$p2=new Person(“宋公明”);
echo $p2->name;
this不能在类定义的外部使用,只能在类定义的方法中使用,我们对 this1.php 做一点修改,来说明这一点。1. $this 本质可以理解就是这个对象的地址。2. 哪个对象使用到$this, 就是哪个对象地址。3. $this不能在类外部使用。
默认构造方法:我们在没有学习构造函数前不是也可以创建对象吗?如果程序员没有定义构造方法,系统会自动生成一个默认构造方法。比如Person类
Person (){};
当创建一个Person对象时 $per1=new Person();
默认的构造函数就会被自动的调用.
(1)一旦自定义了一个构造函数,默认的构造函数就被覆盖了,这时在创建对象的时候就要使用自定义的构造函数。
(2)一个类只能有一个构造函数(不能重载)。
***下面代码会报出函数重复的错误***
class Person{
public $age;
public $name;
function Person(){
echo 'ok1';
}
function Person($name){
echo 'ok2';
}
}
$p1=new Person('sp');
//需求在创建一个人对象时候,我就初始化 name 和 age;->构造方法
class Person{
public $name;
public $age;
public function __construct(){
echo “我是构造方法”;
}
}
$p1=new Person();
构造方法没有返回值, 它是自动被调用。
在php 5 中一个类可以同时有两种形式的构造方法__construct() 和 类名() , 当两个同时存在的时候,优先调用__construct(), 请大家以后使用__construct()。
构造方法的注意事项:
(1)一旦自定义了一个构造函数,默认的构造函数就被覆盖了,这时在创建对象的时候就要使用自定义的构造函数。
(2)一个类只能有一个构造函数.(不能重载)。
构造方法的8点说明:
①构造方法名和类名相同(php4版),php5版的构造方法名可以和类名相同,也可以是__construct()
②构造方法没有返回值
③主要作用是完成对新对象的初始化,并不是创建对象本身。
④在创建新对象后,系统自动的调用该类的构造方法
⑤一个类有且只有一个构造方法,在php5后虽然__construct() 和类名()可以共存,但是实际上也只能使用一个。
⑥如果没有给类自定义构造方法,则该类使用系统默认的构造方法。
⑦如果给类自定义了构造方法,则该类的默认构造方法被覆盖。
⑧构造方法的默认访问修饰符是public。
二、PHP析构方法
PHP5程序设计语言引入了析构函数的概念,这类似于C++。析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。析构方法的作用主要用于释放资源(比如释放数据库的链接,图片资源...销毁某个对象..)
例子:
<?php
class Person{
public $name;
public $age;
public $conn;
public function __construct($name,$age){ //构造方法
$this->name=$name;
$this->age=$age;
//打开一个$conn链接数据库的资源
}
//写一个析构方法 __ 是两个下划线
function __destruct(){
echo $this->name."销毁资源 关闭数据库..<br/>";
}
}
$p1=new Person("张三",16);
$p2=new Person("李五",14);
?>
运行代码我们得出:析构方法会自动调用,析构方法主要用于销毁资源,析构方法调用顺序是先创建的对象后被销毁(栈先进后出)。
析构方法什么时候被调用:
(1)当程序(进程结束)退出时。
(2)当一个对象称为垃圾对象的时候,该对象的析构方法也会被调用。
(3)所谓垃圾对象,就是指没有任何变量再引用它。
(4)一旦一个对象成为垃圾对象,析构方法就会立即调用。
析构函数的格式:
function __destruct(){
//释放资源操作
}
例子:
<?php
class Person{
public $name;
public $age;
function __construct($name,$age){
$this->name=$name;
$this->age=$age;
}
public function show(){
echo "<br/>".$this->name."-".$this->age;
}
function __destruct(){
echo '<br/>销毁该对象'.$this->name;
}
}
$p1=new Person("张三",35);
$p2=new Person("五五",90);
$p3=new Person("王王",3);
$p1->show();
//$px=$p1;//说明垃圾回收器的含义.
$p1=null;//显示销毁, 一但$p1为空就认为是垃圾,系统立即回收。
$p2->show();
$p3->show();
?>
php垃圾回收器:
1. 在php中,当一个对象没有任何引用指向它的时候,就会成为一个垃圾对象,php将启用垃圾回收器将对象销毁,从而回收该对象占用的内存。
2. 当程序退出前,php也将启用垃圾回收器,销毁对象。
类的析构方法小结:
①php5加入的的析构方法function __destruct()
②析构方法没有返回值。
③主要作用是释放资源的操作,并不是销毁对象本身。
④在销毁对象前,系统自动的调用该类的析构方法。
⑤一个类最多只有一个析构方法。
【推荐阅读】
软件设计和网站建设策略分析
陈力:传智播客古代 珍宝币 泡泡龙游戏开发第32讲:PHP 构造方法、析构方法