由PHP实现单向链表引发的对象赋值,对象传参,链表操作引发的一系列问题
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了由PHP实现单向链表引发的对象赋值,对象传参,链表操作引发的一系列问题,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3161字,纯文字阅读大概需要5分钟。
内容图文
![由PHP实现单向链表引发的对象赋值,对象传参,链表操作引发的一系列问题](/upload/InfoBanner/zyjiaocheng/840/77bd3c364ac243afb67dbdab08725eb6.jpg)
2019年2月25日14:21:13
测试版本php 5.4 ,5.6,7.0,7.2
代码请看: https://www.cnblogs.com/zx-admin/p/10373866.html
1,对象赋值
final class Node { public $data; public $next = null; public function __construct($data) { $this->data = $data; } } $a = new Node(['a']); p($a->data); $b = $a; //修改$a的data看是否影响 $a->data = 'sssss'; p($b->data);
Array ( [0] => a ) sssss
会影响$a的数据
$b = &$a; $b = $a;
对于对象来说就是取地址符,但是注意PHP的&不是取地址符,是别名,注意这个是官方解释,但是注意下面的 对象传参,又是另一种写法
$b = clone $a;
会裂变成连个完全独立的内存地址指向
2,对象传参,或者对象传值,对象数据内部遍历指针的问题
代码
final class Node { public $data; public $next = null; public function __construct($data) { $this->data = $data; } } final class LinkedList { // //从链表尾部压入一个节点,节点自动维护,不需要要像main方法那样自己维护 public function push(Node $head, Node $Node) { $current = $head; //让$current指向$head; while ($current->next != null) { $current = $current->next; } $current->next = $Node->next; $current->next = $Node; } //从链表尾压出一个节点 public function pop(Node $head) { $current = $head; //让$current指向$head; while ($current->next != null) { //提前查找链表尾部是否为空,为空就是尾部,吧当前节点的next复制问NULL,就是尾部元素干掉 if ($current->next->next == null) { break; } $current = $current->next; } $current->next = null; } } $head = new Node([]); $a = new Node(['a']); $b = new Node(['b']); $c = new Node(['c']); $d = new Node(['d']); $LinkedList = new LinkedList(); $LinkedList->push($head, $a); $LinkedList->push($head, $b); $LinkedList->push($head, $c); $LinkedList->push($head, $d); $LinkedList->pop($head); pp($head);
结果
Node Object ( [data] => Array ( ) [next] => Node Object ( [data] => Array ( [0] => a ) [next] => Node Object ( [data] => Array ( [0] => b ) [next] => Node Object ( [data] => Array ( [0] => c ) [next] => ) ) ) )
现阶段从结果反推的是对象传参,会自动变成引用对象传参,就是我们平常的写法
function functionName(&$param) { }
类似这种的效果
但是,这个还不是关键
这段代码才是关键
public function push(Node $head, Node $Node) { $current = $head; //让$current指向$head; while ($current->next != null) { $current = $current->next; } $current->next = $Node->next; $current->next = $Node; }
还可以写成这样的
public function push(Node $head, Node $Node) { while ($head->next != null) { $head = $head->next; } $head->next = $Node->next; $head->next = $Node; }
按照我们正常的理解,遍历一个对象 $head 被再次复制,那么遍历到最后$head->next = $Node;应该只剩一个对象元素才对
但是打印 pp($head);依然是没有问题是一个完整的链表
因为无法理解这个遍历过程 pop方法我写了两天无法完成,后来是通过画出链表结构才写出来的了,同时参考了
https://blog.csdn.net/wenximalong/article/details/8296061
但是依然无法理解遍历对象的为什么不管有没有指向$head 的变量使用while遍历的时候发生了什么,这种结构的树状的对象数据,for或者foreach 当然不好使
请参看
https://www.cnblogs.com/zx-admin/p/9820866.html
如果硬要解释的话,不管for foreach while key next 等方法,在使用的时候都独立维护这一套指针,为了完成复杂的指针,指针移动完成不会影响传入的变量或者变量对象
画了个示意图,不保证完全正确,不具备给他们语言的参考性,注意!
就相当于while给你走指针,自己处理处理数据就可以,简单化了操作,复杂了理解,不确定是否理解正确,如果有问题请反馈
内容总结
以上是互联网集市为您收集整理的由PHP实现单向链表引发的对象赋值,对象传参,链表操作引发的一系列问题全部内容,希望文章能够帮你解决由PHP实现单向链表引发的对象赋值,对象传参,链表操作引发的一系列问题所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。