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

内存分为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会变成后出所以才会有李四先被输出,张三在后面


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值