我正在阅读有关 PHP变量引用的文章: http://derickrethans.nl/talks/phparch-php-variables-article.pdf
并且想要检查我的理解是否正确,关于何时创建新的变量容器.

对于非数组,只要您指定一个未指向设置了is_ref的容器的变量,就会创建变量容器.

Ex 1 (let {..} be a container):
$a = 1;     // "a" => {integer,1,is_ref = 0,ref_count = 1}

$b = $a;    // "a","b" => {integer,ref_count = 2}

$b = 2;     // "a" => {integer,ref_count = 1}
            // "b" => {integer,2,ref_count = 1}

Ex 2:
$a = 1;     // "a" => {integer,ref_count = 1}

$b = &$a;    // "a",is_ref = 1,ref_count = 2}

$b = 2;     // "a",ref_count = 2}

它如何适用于数组?它看起来不一样适用.例如,

$a = array(1,3);  
$b = $a;
$c = &$b[2];
$c = 4;
print_r($a); // prints (1,3) instead of (1,4)
print_r($b); // prints (1,4)

我的期望:

$a和$b指向同一个容器.在这个容器中,我们有3个numeric_keys“0”,“1”,“2”分别指向整数1,2和3的容器.

当我们执行$c =& $b [2]时,我们更新包含整数3的容器:

> is_ref = 0变为is_ref = 1
> ref_count = 1变为ref_count = 2.

当我们执行$c = 4时,我们更新包含整数3的容器:

>因为设置了is_ref,整数3变为整数4

但是,我的期望出了点问题,因为$a [2]!= 4最后.我想弄明白为什么.我最好的猜测是,当我们尝试引用数组的元素或对象的属性时,PHP引擎首先检查数组/对象本身以查看是否is_ref = 1.如果是,则一切都按照我的期望工作.如果is_ref = 0,则会发生其他事情,这就是我所看到的.有人可以填写我的“其他东西”是什么吗?

编辑
看起来这就是实际发生的事情.这段代码应该澄清一切!

$a = array(1,3);
$b = $a;
$c = &$b[2];      // $b points to a new container where $b[0],$b[1] still point to same container as $a[0],$a[1],but $b[2] points to a new container also pointed to by $c
$d = $b;        // $d points to $b's container,this means changing $c will also change $d[2]      
$d[0] = 5;      // The container pointed to by $d[0] is the same as the one pointed to by $a[0] and $b[0]. Since this container has is_ref = 0,$d[0] will Now point to a new container

// At this point $a = (1,3),$b = (1,$c = 3,$d = (5,3)

$d[2] = 25;     // The container pointed to by $d[2] is the same as the one pointed to by $b[2] and $c. Since this container has is_ref = 1,Changing $d[2] will affect both $b[2] and $c.

// At this point $a = (1,25),$c = 25,25)

$e = $d[2];     // Since $d[2]'s container has is_ref = 1,$e will point to its own container

$c = 4;         // Same idea as $d[2] = 25; except $e won't get affected

// At this point $a = (1,4),$c = 4,$e = 25

// only way to have $d[2] be different from $b[2] is to make the container's is_ref = 0
unset($b[2]);
unset($c);
$b[2] = $d[2];
$d[2] = 55;

// At this point $a = (1,$e = 25
你创造了什么$a它是一个简单的变量.但是当你创建$b时,默认情况下,PHP复制了变量.所以$b现在与$a完全分开,就像你在第一个例子中那样.

然后将$c设置为等于$b [2]的引用.所以他们都指向相同的内存地址.更新一个,它更新另一个.问题是你认为$a也应该更新,但不应该因为$b是它自己的变量.考虑当我们将$b更改为$a的引用时会发生什么

$a = array(1,3);  
$b = &$a;
$c = &$b[2];
$c = 4;
print_r($a); // prints (1,4)

这就像你描述的那样,因为$b和$a引用相同的东西(技术上$b现在是一个指向$a的符号)

如果你想更深入地探讨这个主题,这里有一篇很好的文章,深入介绍它. http://webandphp.com/how-php-manages-variables

PHP引用如何在数组引擎下工作?的更多相关文章

  1. html5使用canvas实现弹幕功能示例

    这篇文章主要介绍了html5使用canvas实现弹幕功能示例的相关资料,需要的朋友可以参考下

  2. 前端实现弹幕效果的方法总结(包含css3和canvas的实现方式)

    这篇文章主要介绍了前端实现弹幕效果的方法总结(包含css3和canvas的实现方式)的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  3. H5 canvas实现贪吃蛇小游戏

    本篇文章主要介绍了H5 canvas实现贪吃蛇小游戏,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  4. HTML5页面无缝闪开的问题及解决方案

    这篇文章主要介绍了HTML5页面无缝闪开方案,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. ios – parse.com用于键,预期字符串的无效类型,但是得到了数组

    我尝试将我的数据保存到parse.com.我已经预先在parse.com上创建了一个名为’SomeClass’的类.它有一个名为’mySpecialColumn’的列,其数据类型为String.这是我尝试使用以下代码保存数据的代码:如果我运行这个我得到:错误:密钥mySpecialColumn的无效类型,预期字符串,但得到数组这就是我在parse.com上的核心外观:有谁知道我为什么会收到这个错误?

  6. ios – 上下文类型’NSFastEnumeration’不能与数组文字一起使用

    斯威夫特3,你会这样做吗?解决方法正如您所发现的,您不能使用as-casting将数组文字的类型指定为NSFastEnumeration.您需要找到一个符合NSFastEnumeration的正确类,在您的情况下它是NSArray.通常写这样的东西:

  7. ios – 如何从变量访问属性或方法?

    是否可以使用变量作为Swift中方法或属性的名称来访问方法或属性?在PHP中,您可以使用$object->{$variable}.例如编辑:这是我正在使用的实际代码:解决方法你可以做到,但不能使用“纯粹的”Swift.Swift的重点是防止这种危险的动态属性访问.你必须使用Cocoa的Key-ValueCoding功能:非常方便,它完全穿过你要穿过的字符串到属性名称的桥,但要注意:这里是龙.

  8. iOS >>块>>更改块外部的变量值

    我不是在处理一个Object并改变它,就像我的mString一样.我希望’center’属性的行为类似于myInt,因为它是直接访问的C结构,而不是指向对象的指针.我希望’backgroundColor’的行为类似于我的imstring,因为它是一个指向一个新对象的对象的指针,不是吗?

  9. ios – Xcode Bot:如何在post触发器脚本上获得.ipa路径?

    我正在使用机器人来存档iOS应用程序,我需要获取.ipa产品路径才能将其发布到我们的分发系统中.机器人设置:并使用脚本打印所有env变量,其中不包含ipa文件的路径.此外,一些变量指向不存在的目录,即:XCS_OUTPUT_DIR这里的env变量输出:除此之外,我还能够确认.ipa文件是在另一个文件夹中创建的(/IntegrationAssets//

  10. ios – 使用附加字符串本地化Info.plist变量

    我正在尝试本地化应用程序的名称,同时仍然能够根据构建配置追加字符串.所以目前它被设置为:该设置定义为:通过这种方式,我们可以为应用程序添加后缀以用于不同的beta版本.问题是,当我们尝试本地化本地化的InfoPlist.strings中的应用程序显示名称时,就像这样我们覆盖存储在Info.plist中的值,并丢失后缀字符.这有什么好办法吗?

随机推荐

  1. PHP个人网站架设连环讲(一)

    先下一个OmnihttpdProffesinalV2.06,装上就有PHP4beta3可以用了。PHP4给我们带来一个简单的方法,就是使用SESSION(会话)级变量。但是如果不是PHP4又该怎么办?我们可以假设某人在15分钟以内对你的网页的请求都不属于一个新的人次,这样你可以做个计数的过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里。以后每个页面被访问时都检查cookie上次访问时间值。

  2. PHP函数学习之PHP函数点评

    PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助

  3. ecshop2.7.3 在php5.4下的各种错误问题处理

    将方法内的函数,分拆为2个部分。这个和gd库没有一点关系,是ecshop程序的问题。会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可

  4. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. zen_cart实现支付前生成订单的方法

    这篇文章主要介绍了zen_cart实现支付前生成订单的方法,结合实例形式详细分析了zen_cart支付前生成订单的具体步骤与相关实现技巧,需要的朋友可以参考下

  7. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  8. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  9. 基于win2003虚拟机中apache服务器的访问

    下面小编就为大家带来一篇基于win2003虚拟机中apache服务器的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

返回
顶部