黄宽的blog

宁可十年不将军,不可一日不拱卒



对第39篇博文的修正

近期翻阅了一些资料,附上链接https://secure.php.net/manual/zh/language.oop5.references.php

第39篇博文的链接http://www.php01.com/home/index/art/artid/39.html

发现与官方文档有出入,之前写那篇博文的时候,是看的一本叫作PHP核心技术与最佳实践的书,然后这本书的出版日期是2012年的,然后近期翻阅其他关于php底层的一些东西的时候提到了对象,对对象的解释与这本书的解释不一样,最后找到官方发现我之前看的那本书的一些知识已经过期了。现在来讲讲至少是php5的对象到底是什么了。

官方文档这么描述的:

在php5 的对象编程经常提到的一个关键点是“默认情况下对象是通过引用传递的”。但其实这不是完全正确的。下面通过一些例子来说明。

php的引用是别名,就是两个不同的变量名字指向相同的内容。在php5,一个对象变量已经不再保存整个对象的值。只是保存一个标识符来访问真正的对象内容。 当对象作为参数传递,作为结果返回,或者赋值给另外一个变量,另外一个变量跟原来的不是引用的关系,只是他们都保存着同一个标识符的拷贝,这个标识符指向同一个对象的真正内容。

typedef struct _zend_object_value {
    zend_object_handle handle; //无符号整数,这里保存的是一个指针,就是官网说的标识符,指向对象的属性
   zend_object_handlers *handlers;//这个可以理解为这个对象所属于的类(主要是里面的方法)
} zend_object_value;

所以,class Dog{

public $age=5;

}

$dog1 = new Dog();

$dog2=$dog1;

$dog2->age=3;

echo $dog1->age;等于几呢?答案是3,修改属性并不会导致zval分裂,因为一个对象的到对象的属性有三层,dog1和dog2指向同一个指针,而这个指针指向的是一张符号表,修改的是符号表里的属性值。如果修改的是指针,则分裂。例如$dog2=1;此时才会分裂。

 

 

  php

作者  :  黄宽

不耻最后,即使慢,驰而不息,纵会落后,纵令失败



About ME

about me

黄宽

我不想成为一个庸俗的人。十年百年后,当我们死去,质疑我们的人同样死去,后人看到的是裹足不前、原地打转的你,还是一直奔跑、走到远方的我?

友情链接