PHP实现链表:该构造方式是否安全?
关于链表代码中局部变量引用的困惑解答
嘿,我完全懂你为啥会有这个疑问——刚接触PHP引用的时候很容易搞混变量容器和值的内存关系!咱们一步步拆解清楚:
首先得纠正一个核心误解:PHP里的引用不是指向变量本身,而是指向变量所对应的值的内存地址。
咱们看你提到的那几行代码:
$link = new Node();—— 这行代码做了两件事:一是在内存里创建了一个Node对象实例,二是让局部变量$link持有指向这个对象内存地址的引用。$this->firstNode = &$link;—— 这行不是让$firstNode指向$link这个变量容器,而是让它也持有和$link完全相同的引用:也就是指向那个刚创建的Node对象的内存地址。
那当方法执行完毕后,局部变量$link确实会被销毁,但这只是销毁了变量容器,而它指向的Node对象并不会跟着消失!因为$this->firstNode还牢牢握着对这个对象的引用呢。PHP的垃圾回收规则是:只有当一个对象没有任何引用指向它的时候,才会被标记为垃圾并释放内存。
给你举个直观的小例子验证一下:
class DemoLinkedList { public $firstNode; public function initFirstNode() { $link = new stdClass(); $link->data = "测试数据"; $this->firstNode = &$link; // 和你的代码逻辑一致 } } $list = new DemoLinkedList(); $list->initFirstNode(); // 方法执行完后,$link已经销毁,但firstNode依然能访问对象 echo $list->firstNode->data; // 会输出:测试数据
所以你完全不用担心$firstNode会指向“已不存在的变量”——它从始至终指向的都是Node对象的内存,只要$firstNode还在,这个对象就会好好待在内存里。
内容的提问来源于stack exchange,提问作者DavidL
相关产品推荐
相关产品推荐

