• 技术文章 > php教程 > php教程

    深入理解PHP7内核之Reference

    藏色散人 藏色散人 2019-02-12 14:56:55 转载 358
    之前说过引用(REFERENCE)在PHP5的时候是一个标志位, 而在PHP7以后我们把它变成了一种新的类型:IS_REFERNCE. 然而引用是一种很常见的应用, 所以这个变化带来了很多的变化, 也给我们在做PHP7开发的时候, 因为有的时候疏忽忘了处理这个类型, 而带来不少的bug.

    最简单的情况, 就是在处理各种类型的时候, 从此以后我们要多考虑这种新的类型, 比如在PHP7中, 这样的代码形式就变得很常见了:

    try_again:
    swtich (Z_TYPE_P(zv)) {
         case IS_TRING:
         break;
         case IS_ARRAY:
         break;
        ...
         case IS_REFERENCE:
         zv = Z_REFVAL_P(zv); //解引用
         goto try_again;
         break;
    }

    如果大家自己写的扩展, 如果忘了考虑这种新的类型, 那么就会导致问题.

    为什么?

    那么既然这种新类型会带来这么多问题, 那么当时为什么要用把引用变成一种类型呢? 为什么不还是使用一个标志位呢?

    一句话来说, 就是我们不得不这么做. -_#

    前面说到, Hashtable直接存储的是zval, 这样在符号表中, 俩个zval如何共用一个数值呢? 对于字符串等复杂类型来说还好, 我们貌似可以在zend_refcounted结构中加入一个标志位来表明是引用来解决, 然而这个也会遇到Change On Write带来的复制, 但是我们知道在PHP7中, 一些类型是直接存储在zval中