您的位置:首页 > 编程语言 > PHP开发

php中对象,类与内存的关系

2016-03-09 16:36 489 查看
内存分为4个部分

数据段,栈段,代码段,堆段。

栈是先进后出,而且分配的内存很少,但是速度很快,通常用于保存一些标量,例如(int,string,boolean)因为这些已经知道他的内存大小,所以可以直接放到栈中。而对象,数组等一些不知道大小的变量,那么就会存放到堆内存中。

所以当我们创建数组跟对象的时候,同时也会产生一个引用,这个引用是已知大小的,所以就放在栈内存中,而实际的内容就会放在堆内存中。这就是为什么数组跟对象是引用变量。

<?php
class Person
{
public $name;
public $age;
public $knows;
//构造函数,当类被实例化时,会自动执行
public function __construct()
{
//实例化方式 $变量名 = new 类名();
//其中$变量名就是这个类的引用,变量名当要存储的时候
//被改变成pc认知的名字即内存地址来存储在栈内存中
echo "这里被执行了";
}
}
$p1 = new Person();
?>



其中__construct就是这个类的构造函数,当这个类被实例化的时候,这个函数就会自动执行。而当一个类的引用断了的时候,这个在内存在就被当做垃圾,php就会执行垃圾回收机制,将这个类回收掉



而当类将要被回收的时候,还会执行一个魔术函数,这个函数是__destruct

<?php
class Person
{
public $name;
public $age;
public $knows;
//构造函数,当类被实例化时,会自动执行
public function __construct($name)
{
//实例化方式 $变量名 = new 类名();
//其中$变量名就是这个类的引用,变量名当要存储的时候
//被改变成pc认知的名字即内存地址来存储在栈内存中
$this -> name = $name;
echo $this->name."这里被执行了<br>";
}
public function __destruct()
{
echo $this->name."我被回收了<br>";
}
}
$p1 = new Person("张三");
$p2 = new Person("李四");
/*输出
张三这里被执行了
李四这里被执行了
李四我被回收了
张三我被回收了
*/
?>在上面我们会发现,先被回收的是$p2而不是$p1;
这是因为$p1与$p2这两个变量是存储在栈内存中,所以当回收的时候,先进的$p1会变成后出所以才会有李四先被输出,张三在后面
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: