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会变成后出所以才会有李四先被输出,张三在后面
数据段,栈段,代码段,堆段。
栈是先进后出,而且分配的内存很少,但是速度很快,通常用于保存一些标量,例如(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会变成后出所以才会有李四先被输出,张三在后面
相关文章推荐
- php中对MYSQL操作之批量运行,与获取批量结果
- PHP GIF 动画缩略图
- PHP empty、isset、isnull的区别
- PHP获取某年第几周的开始日期和结束日期
- 利用xampp搭建Yii1.1.17
- php session过期时间设置,纯新手教学
- windows7上安装php7和apche2.4
- 彻底解决PHP Session不过期以及SessionId保持不变的问题
- php导入导出excel表格
- php手动释放内存
- phpmailer实现邮件发送
- PHP根据身份证号码验证、获取星座、生肖和性别函数
- 如何安装Yaf框架?
- php的学习笔记之面向对象(二)
- php 打印函数(echo , print, printf, print_f, var_dump)
- php 正则表达式
- php单例模式
- php工厂模式
- 我的vsftp.conf 及iptables 配置
- php标准库(SPL)-SPL函数