由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是弱类型语言,变量即可表示数值,也可表示对象:链表节点的数据域的值就 ...
随机推荐
- kde钱包 忘记密码
转自 https://forum.suse.org.cn/t/kwallet/4367/2 修改 ~/.config/kwalletrc文件的First Use=false 改成 true 应该可以重 ...
- 异常-CDH的service无法启动并抛出异常-org.apache.avro.AvroRemoteException: java.net.ConnectException: Connection refused (Connection refused)
1 详细异常 org.apache.avro.AvroRemoteException: java.net.ConnectException: Connection refused (Connectio ...
- 基于 Webhooks gitlab 自动化构建
基于gitlab webhooks 自动构建流程 1.服务器安装 git 服务 安装成功 配置 PHP 脚本: <?php // 接受头部信息 if (!isset($_GET['youpara ...
- LNMP 下使用命令导出导入 MySQL 数据库
导出数据库 导出数据库为 db_wp.sql.gz 文件: 1 mysqldump -u数据库用户名 -p数据库密码 --add-drop-table --complete-insert 数据库名 | ...
- nginx+tomcat:动静分离+https
nginx server { listen 80; server_name 192.168.0.103; # http访问重写为https rewrite ^ https:/$http_host$re ...
- windows上安装gcc/g++环境(MinGW,msys64等)
1 前言 经过折腾安装gcc环境,记录一下 2 工具 MinGW安装器: 下载地址1:MinGW官网 下载地址2:SourceForge (MinGW w64) 下载地址3:win-builds-1 ...
- setInterval动态时间处理
- zoj4027 线性dp!好题
非常好的dp,可是我太菜做不出来.. /* 第i个左括号不可能越过第i+1个左括号 如果第i个左括号到位置j,前提是第i+1个左括号就必须到位置j+1即以后 用dp[i][j]表示把第i个左括号转移到 ...
- python第九天(9-34)
一:队列的三种模式 先进先出(FIFO) class queue.Queue(maxsize) 后进先出(LIFO) class queue.LifoQueue(maxsize) 优先级顺序(优先级低 ...
- Java Spring Boot VS .NetCore (六) UI thymeleaf vs cshtml
Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ...