PHP变量内存分配问题记录整理_php技巧

今天碰到一个关于php变量内存分配的问题,记录一下。

如下这段代码:

复制代码 代码如下:

$a = array (
'str' => 1,
'child' => 2
);

$b = $a;
$b['child'] = $a;
$b['child']['str'] = 2;
echo $b['str'];
$b = null;
echo $a['str'];

会输出什么呢,结果是11,$b=$a的时候其实并没有新分配内存,ab是指向的同一个区域,$b['child']=$a时,$b会先copy一份原来$a的内容,然后再修改,也就是说这时候$b和$a指向了不同的区域,再修改$a或者$b的时候都不会互相影响了。

再看这段代码:

复制代码 代码如下:

class A
{
public $str = '';
public $child;
}

$a = new A();
$b = $a;
$a->str = 1;
$a->child = 2;
$b->child = $a;
$b->child->str = 2;
echo $b->str;
$b = null;
echo $a->str;

又会输出什么呢,结果是22,根据实际情况来判断,$b->child=$a的时候,并没有像数组那样,重新copy一份,ab以及a->child都是指向的同一片区域,这样改任何一个,其余几个都会被改掉。

可是PHP为啥要设计成这样呢。

时间: 2024-10-01 13:31:30

PHP变量内存分配问题记录整理_php技巧的相关文章

PHP入门教程之自定义函数用法详解(创建,调用,变量,参数,返回值等)_php技巧

本文实例讲述了PHP自定义函数用法.分享给大家供大家参考,具体如下: Demo1.php <?php //标准函数,内置函数 echo md5('123456'); echo '<br/>'; echo sha1('123456'); echo '阅谁问君诵,水落清香浮.'; ?> Demo2.php <?php //创建函数,不要跟系统的内置函数重名 //函数有个特性,必须调用,才可以执行 //无参数表示()里面是空的,无返回就是函数的程序里没有 return functi

PHP内核探索:变量存储与类型使用说明_php技巧

先回答前面一节的那个问题吧. 复制代码 代码如下: <?php    $foo = 10;    $bar = 20;     function change() {        global $foo;        //echo '函数内部$foo = '.$foo.'<br />';        //如果不把$bar定义为global变量,函数体内是不能访问$bar的        $bar = 0;        $foo++;    }     change();    e

浅析PHP原理之变量分离/引用(Variables Separation)_php技巧

首先我们回顾一下zval的结构: 复制代码 代码如下: struct _zval_struct {        /* Variable information */        zvalue_value value; /* value */        zend_uint refcount;        zend_uchar type; /* active type */        zend_uchar is_ref;}; 其中的refcount和is_ref字段我们一直都没有介绍过

PHP中异常处理的一些方法整理_php技巧

每一个新的功能添加到PHP运行时会创建一个指数随机数,通过这样的方式开发者可以使用和甚至滥用这个新特性.然而,直到一些好的和坏的使用情况陆续出现开发者们才达成了共识.当这些新案例不断浮现,我们终于可以辨别出什么是最好或最坏的做法. 异常处理在PHP中的确无论如何都不算是一个新的特征.但在本文中,我们将讨论在PHP 5.3中基于异常处理的两个新的特点.第一个是嵌套异常第二是一套SPL(现在的PHP运行机制的一个核心扩展)的扩展的新的异常类型.这两个新特性,这本书里都能找到最佳实践值得各位去详细研究

php实用代码片段整理_php技巧

本文整理归纳了php实用代码片段.分享给大家供大家参考,具体如下: 一 从网页中提取关键词 $meta = get_meta_tags('http://www.jb51.net/'); $keywords = $meta['keywords']; // Split keywords $keywords = explode(',', $keywords ); // Trim them $keywords = array_map( 'trim', $keywords ); // Remove emp

PHP 常用时间函数资料整理_php技巧

php常用的时间函数 测试环境:php5.3.29 unix时间戳(从Unix 纪元(January 1 1970 00:00:00 GMT)到给定时间的秒数.).以下简称时间戳. 返回某一时间的时间戳. time(); 获取当前本机时间的时间戳. mktime(时,分,秒,月,日,年); //从右向左可以省略,省略到的参数用本机时间替换,比如省略了最后日和年就应用当前时间 22日 2016年. //年可写两位或四位数字.两位时0-69 对应于 2000-2069,70-100 对应于 1970

PHP中文件缓存转内存缓存的方法_php技巧

前言 顾名思义文件缓存转内存缓存就是将存储在文件中的数据转到内存中去,实现磁盘操作转为内存操作,这样可以大大提高数据访问速度,并能实现缓存数据的分布式部署.文件缓存与内存缓存的介绍请参考名词解释部分. 原理 文件缓存转内存缓存的原理就是把文件缓存中的数据转存到内存中,以实现数据全局共享,解决频繁加载文件和装载数据的问题,采用Memcache工具实现内存缓存数据. 实现机制与步骤 1,检查文件是否存在内存缓存,如果不存在加载缓存文件 2,加载缓存文件,并获取缓存文件中的数据 3,将缓存文件中的数据

深入PHP变量存储的详解_php技巧

1.1.1 zval结构Zend使用zval结构来存储PHP变量的值,该结构如下所示: 复制代码 代码如下: typedef union _zvalue_value { long lval;    /* long value */ double dval;    /* double value */ struct {  char *val;  int len; } str; HashTable *ht;    /* hash table value */ zend_object_value ob

PHP中类属性与类静态变量的访问方法示例_php技巧

本文实例讲述了PHP中类属性与类静态变量的访问方法.分享给大家供大家参考,具体如下: <?php /* PHP类属性与类静态变量的访问 * Created on 2016-7-13 */ class test { const constvar='hello world'; static $staticvar='hello world'; function getStaticvar(){ return self::$staticvar; } } $obj=new test(); echo test