面向对象:构造函数,析构函数


/**
燕十八 公益PHP培训
课堂地址:YY频道88354001
学习社区:www.zixue.it
**/

 

 

<?php
/****
燕十八 公益PHP讲堂

论 坛: http://www.zixue.it
微 博: http://weibo.com/Yshiba
YY频道: 88354001
****/


/***
====笔记部分====
构造函数 __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培训
课堂地址:YY频道88354001
学习社区:www.zixue.it
**/

 

 

<?php
/****
燕十八 公益PHP讲堂

论 坛: http://www.zixue.it
微 博: http://weibo.com/Yshiba
YY频道: 88354001
****/


/***
====笔记部分====
构造方法 __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培训
课堂地址:YY频道88354001
学习社区:www.zixue.it
**/

<?php
/****
燕十八 公益PHP讲堂

论 坛: http://www.zixue.it
微 博: http://weibo.com/Yshiba
YY频道: 88354001
****/


/***
====笔记部分====
析构函数: __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
/****
燕十八 公益PHP讲堂

论 坛: http://www.zixue.it
微 博: http://weibo.com/Yshiba
YY频道: 88354001
****/


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

疑问:
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次
死在系统回收时,即页面执行完毕,因此在灰线下.
*/

 

 

<?php
/****
燕十八 公益PHP讲堂

论 坛: http://www.zixue.it
微 博: http://weibo.com/Yshiba
YY频道: 88354001
****/


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

***/


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


class Human {

public $name = '张三';
public $gender = null;

public function __destruct() {
echo '死了!<br />';
}

}


$e = $f = $g = new Human();
unset($e);
echo 'unset e<br />';

unset($f);
echo 'unset f<br />';

unset($g);
echo 'unset g<br />';

/*
unset e
unset f
死了
unset g;
*/

<?php
/****
燕十八 公益PHP讲堂

论 坛: http://www.zixue.it
微 博: http://weibo.com/Yshiba
YY频道: 88354001
****/

 

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

 

class Human {
public $name = 'lisi';

public function who() {
echo $this->name;
}

public function test() {
echo $name;
}

}

$a = new Human();


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

$a->who();


/*
和java,c++相比
方法体内想访问调用者的属性,必须用$this
如果不加,则理解为方法内部的一个局部变量.
*/
$a->test();

 

/******
从生活中的角度来理解$this

女娲造人时, 造了一个"悔恨"的方法

{
抓[自己]头发
抽 [自己] 脸

}

世界上的人那么多,
悔恨时,抓谁的头发?
抽谁的脸?


张三,李四? 王五? 都不能说明合理的情况
只能理解为"自己"
******/

====今天内容===
构造函数与析构函数
生成对象时的内存变化
this的绑定
封装概念

 

===回顾====

面向对象的哲学
类与对象的概念
写类的基本语法
声明属性与方法时的注意点

属性:只能是直接的量,不能是表达式的运算结果或函数返回值
也可以不为属性赋值,则为NULL

方法: 方法被包在类中,与外部的函数 可以重名,不冲突.

 

 

posted on 2012-11-12 14:26  besile  阅读(234)  评论(0)    收藏  举报