php调用自己,PHP如何处理一个引用自身作为元素的数组?

在内部PHP中,所有内容都存储在名为

ZVAL的

variant容器中。$数据由ZVAL表示,每个键和$数据中的每个值都是ZVAL等。

所以在初始赋值后,从PHP创建了三个ZVAL:

/-------------------\ /-------------------\

| ZVAL #1 | /==>| ZVAL #2 |

| type: array | | | type: string |

| data: [ | | | data: "foo" |

| { | | \-------------------/

| key: =======/ /-------------------\

| val: ================================>| ZVAL #3 |

| } | | type: string |

| ] | | data: "bar" |

\-------------------/ \-------------------/

注意:数组项目的内部表示与上述不相符;我不想用不必要的细节来负担这个答案。由于相同的原因,ZVAL的表示也被简化。如果您想了解有关PHP内部的更多内容,请阅读源和/或this。

您可以看到,使用“foo”和“bar”作为数组键/值对的事实无法通过查看其ZVAL来确定:您必须知道它们被数组引用。

在分配$ data [‘baz’] =& $ data之后,会发生什么现在有一个循环引用:ZVAL#1中的某个地方有一个指针返回到ZVAL#1:

/-------------------\ /-------------------\

| ZVAL #1 | /==>| ZVAL #2 |

/=>| type: array | | | type: string |

| | data: [ | | | data: "foo" |

| | { | | \-------------------/

| | key: =======/ /-------------------\

| | val: ================================>| ZVAL #3 |

| | }, | | type: string |

| | { | | data: "bar" |

| | key: =========================\ \-------------------/

| | val: =========\ |

| | } | | | /-------------------\

| | ] | | \======>| ZVAL #4 |

| \-------------------/ | | type: string |

| | | data: "baz" |

\===========================/ \-------------------/

那么PHP如何解决$ data [‘baz’] [‘baz’]?它知道$数据由ZVAL#1表示,并且它看到您正在尝试使用数组语法对其进行索引。它查看ZVAL,看到它是一个数组,找到具有键“baz”的项,并获取表示它的ZVAL。你知道什么?再次是ZVAL#1。最终解决了$ data [‘baz’]。

在下一步,它会看到您正在尝试将数据索引到$ data [‘baz’]。它知道$数据[‘baz’]由ZVAL#1表示,所以同样的事情会再次发生,等等。

您将注意到,上述过程不涉及存储任何中间结果(第一步和第二步完全独立),这意味着在尝试解析阵列访问时,没有资源限制被PHP虚拟机击中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值