php - @amazeUI - 2017-02-05 06:48:03

近期翻阅了一些资料,附上链接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;此时才会分裂。
网友评论