构造函数详解跟析构函数与对象的回收机制

  • 1,662

在类中, 有一个构造函数,

就是用来初始化对象用的.

利用构造函数,你有机会操作对象,

并改变他的值

<?php


/***
====笔记部分====
构造函数 __construct()

***/


/****
代码部分
****/
header('Content-type:text/html; charset=utf-8');

class Human {
    public $name = '李四';
    public $gender = '男';
}


$a = new Human();

$b = new Human();

$c = new Human();


echo $a->name,'<br />';
echo $b->name,'<br />';
echo $c->name,'<br />';

echo $a->gender,'<br />';
echo $b->gender,'<br />';
echo $c->gender,'<br />';


/*
在上面的例子中, 体现出类是模板,对象根据模板造出的实例.
但是,模板是固定的.

因此,导致造出来的对象,各种属性值都一样.
这显示与现实生活中的逻辑不符.

比如: 新生儿,
性别
姓名
体重
这些都不一样.

同一个模板,不同的对象 这就是一对矛盾?
答:___


想一想: 为什么新生儿有的是男,有的是女?
答:因为,染色体不一样.
x,y ->男
x,x-->女
造对象时,传x染色体,还是y染色体,都有可能
这就说明创建对象时,可以传参


在类中, 有一个构造函数,
就是用来初始化对象用的.
利用构造函数,你有机会操作对象,
并改变他的值 

*/









<?php



/***
====笔记部分====
构造方法 __construct();  注意 前面是两个下滑线

构造方法的作用时机:
每当new一个对象,就会自动新new出来的对象发挥作用


new ClassName($args);

$args参数原样传给构造方法;
然后构造方法,用参数来影响新创建的对象

当然:new ClassName() 也可以不传参

但注意: $args要与构造方法里的参数一致.


***/

/*
class Human {
    public function __construct() {
        echo '紫微星下凡了!';
    }

    public $name = null;
    public $gender = null;
}

$a = new Human();
*/

// 构造函数的传参,并影响对象
/*
class Human {
    public function __construct() {
        $this->name = '李四';
        $this->gender = '女';
    }

    public $name = null;
    public $gender = null;
}

$a = new Human();
$b = new Human();
$c = new Human();

echo $a->name,'<br />'; // 李四
echo $b->name,'<br />'; // 李四
echo $c->name,'<br />'; // 李四
*/



class Human {
    public function __construct($name,$gender) {
        $this->name = $name;
        $this->gender = $gender;
    }

    public $name = null;
    public $gender = null;
}

$a = new Human('张飞','男');
$b = new Human('空姐','女');
$c = new Human('孙二娘','女');
$d = new Human();

echo $a->name,'<br />'; // 张飞
echo $b->name,'<br />'; // 空姐
echo $c->name,'<br />'; // 孙二娘




<?php


/***
====笔记部分====
析构函数: __destruct()

构造函数是在对象产生的时候,自动执行
析构函数是在对象销毁的时候,自动执行

构造函数就是出生时啼哭
析构函数就是临终遗言

对象如何销毁?
1:显式的销毁, unset ,赋值为NULL,都可以
2:PHP是脚本语言,在代码执行到最后一行时,
所有申请的内存都要释放掉.
自然,对象的那段内存也要释放,对象就被销毁了.


对于PHP所做的WEB程序,想犯内存泄露的错误也很难.

***/


class Human {

    public $name = null;
    public $gender = null;
    
    public function __construct() {
        echo '出生了<br />';
    }

    public function __destruct() {
        echo '终究没能逆袭!<br />';
    }

}



$a = new Human();
$b = new Human();
$c = new Human();
$d = new Human();


unset($a);

$b = true;
$c = NULL;

// 死3次

echo '<hr />';

/*
63行也执行完毕,页面执行完毕, $d 得回收,
*/

/***
最后一次销毁,是PHP的页面执行完毕了,63行也执行完毕了.
然后系统回收, $d此时才销毁,
因此 显示hr 即灰线后面
***/







<?php



/***
====笔记部分====

疑问:
1:把对象赋值为其他,比如true 会不会销毁对象?
 小K (21:07:15)
试了下,也可以


2:上一页的案例
为什么销毁一个  空2个  最后一个会出现在灰线下面?
答:
最后一次销毁,是PHP的页面执行完毕了,63行也执行完毕了.
然后系统回收, $d此时才销毁,
因此 显示hr 即灰线后面


***/


/****
代码部分
****/


/// 对象的回收机制 ///
class Human {

    public $name = '张三';
    public $gender = null;
    
    public function __destruct() {
        echo '死了!<br />';
    }

}


$a = new Human();
$b = $c = $d = $a;


echo $a->name,'<br />';
echo $b->name,'<br />';

$b->name = '李四';
echo $a->name,'<br />';
echo $b->name,'<br />';



unset($a);   // $b,$c,$d在指向对象,因此对象不能销毁.

echo '<hr />';

/*
1:死几次
2:死上灰线上,还是死在灰线下
*/

/*
在此处,页面运行完毕,对象销毁,执行析构函数.
销毁了几个对象? 

答:
只有一个对象,只死1次
死在系统回收时,即页面执行完毕,因此在灰线下.
*/



相关:

 

 

weinxin
我的微信
这是我的微信扫一扫
开拓者博主
  • 本文由 发表于 2016年8月16日19:52:15
  • 转载请务必保留本文链接:https://www.150643.com/324.html
匿名

发表评论

匿名网友 填写信息

评论:1   其中:访客  1   博主  0
    • 大前端 大前端 1

      总结的很到位!不错!