由PHP实现单向链表引发的对象赋值,对象传参,链表操作引发的一系列问题
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实现单向链表引发的对象赋值,对象传参,链表操作引发的一系列问题的更多相关文章
- jQuery对象初始化的传参方式
jQuery对象初始化的传参方式包括: 1.$(DOMElement) 2.$(' ... '), $('#id'), $('.class') 传入字符串, 这是最常见的形式, 这种传参数经常也传入第 ...
- js 日期对象Date以及传参
创建一个日期对象,日期对象可传参new Date() 创建日期对象getFullYear() 获取年份 getMonth() 获取月份 返回值是 0(一月) 到 11(十二月) 之间的一个整数 get ...
- Python开发:OpenCV版本差异所引发的cv2.findContours()函数传参问题
一.问题如下: cv2.findContours()这个方法是用来找出轮廓值的: # cv2.findContours找出轮廓值,cv2.RETR_EXTERNAL表示图像的外轮廓 binary, c ...
- Java的对象传参问题
在c/c++中对于传参类型,无外乎就是传值.传引用.传指针这几种.但在java中,由于没有指针类型,其传参的方式也发生了相应的变化.之前有搜过相关的知识点一直理解的是:Java的传参方式中主要有两种: ...
- Python对象赋值、浅拷贝、深拷贝
Python中,基本数据类型,理解为常见数据类型:布尔型.整型.浮点型.字符串.列表.元组.字典.集合,随语言不同而不同,但是根据在内存中存储方式的不同,区分开原子类型和容器类型. 对象赋值 对象的赋 ...
- O-C相关-06:对象与对象的关系
对象与对象的关系 1.对象与对象的关系 依赖 关联 组合 常常讨论对象与对象关系时会提供两个属于:内聚性,耦合性 内聚一般指功能上的指向性 耦合一般指关联上的依赖性 2.依赖: 对象之间最弱的一种关联 ...
- Django运算表达式与Q对象/F对象
Django运算表达式与Q对象/F对象 1 模型查询 概述: 1 查询集:表示从数据库中获取的对象的集合 2 查询集可以有多个过滤器,通过 逻辑运算符连接 3 过滤器就是一个函数,基于所给的参数限制查 ...
- 异常详细信息: System.InvalidOperationException: 对象的当前状态使该操作无效
源错误: 执行当前 Web 请求期间生成了未处理的异常.可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息. 堆栈跟踪: [InvalidOperationException: 对象的当前 ...
- php数据结构课程---2、链表(php中 是如何实现单链表的(也就是php中如何实现对象引用的))
php数据结构课程---2.链表(php中 是如何实现单链表的(也就是php中如何实现对象引用的)) 一.总结 一句话总结: php是弱类型语言,变量即可表示数值,也可表示对象:链表节点的数据域的值就 ...
随机推荐
- luogu P5291 [十二省联考2019]希望
luogu loj 无论最终结果将人类历史导向何处 \(\quad\)我们选择 \(\quad\quad\)\(\large{希望}\) 诶我跟你讲,这题超修咸的 下面称离连通块内每个点距离不超过\( ...
- 关于NB-IoT的十大问题和答案【转】
转自:https://blog.csdn.net/u011943791/article/details/80287053 今天大白来给各位解答一下关于NB-IoT的十大问题. 问1:NB-IoT模块还 ...
- css布局中的百分比布局
1.在说到百分比是前,先简单了解下基本的单位 英寸(inch) :in 1 in=2.54cm厘米(centimeter):cm毫米(millimeter):mm磅(point):pt 1pt=1/7 ...
- 12、Grafan 4.3升级到Grafana 5.0
Upgrading Grafana 升级Grafana We recommend everyone to upgrade Grafana often to stay up to date with t ...
- RecyclerView滑动到指定位置,并置顶
一般我们用 mRecycleview.smoothScrollToPosition(0)滑动到顶部,具有滚动效果,但是如果我们想滚动到任意指定位置,那么smoothScrollToPosition() ...
- ECMAScript 6 变量的解构赋值
1.数组的结构赋值 1.1 基本用法 可以用“模式匹配”的写法给数组的元素赋值,只要等号两边的模式相同,左边的变量就会被赋予对应的值.注意:元素的值和位置是一一对应关系,如果对应的位置没有值,就会解构 ...
- VsCode创建第一个vue项目
使用vue-cli快速构建项目 vue-cli 是vue.js的脚手架,用于自动生成vue.js模板工程的. 安装vue-cli之前,需要先安装了vue和webpack · node -v ...
- HttpConnection
1.HttpConnection 用于接受和发送网络数据 网络操作必须新开个子线程执行,否则会出现 ANR(Application Not Response) 应用无响应异常 Get: /** * 通 ...
- python 几个简单算法详解
一.冒泡排序 基本思想:它的思路很有特点循环,两两向后比较.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数 ...
- NEO智能合约开发(一)不可能完成的任务
悬赏任务 兹有如下合约 public static object Main(string method, object[] args) { if (Runtime.Trigger == Trigger ...