php5 中, 对象引用的注意问题
php5|对象|问题
在php4年代, 对象的引用是通过一个简单的 "&" 符号来实现的.
在php5中($obj1 = $obj2;)默认就是引用的方式, 不需要刻意的加一个 "&" 符号,但是在php5中仍然还保留了php4种
的这用引用方式.
但是这两种方式到底有什么区别呢,下面让我们来看看分析一下.
老的引用方式实现方式如下(下面的一段代码可以在php4和php5上跑):
代码1:
class test{ function get(){return "aaaaa";} }
$t1 = new test();
$t2 = &$t1;
echo $t1->get()."
";
echo $t2->get()."
";
?>
这样变量 $t1 和 $t2 就指向了同一个对象, 他们共享内存中的同一个对象.
代码2:
class test{ function get(){return "aaaaa";} }
$t1 = new test();
$t2 = &$t1;
unset($t1);
echo ($t1===null)? "t1 is null.
": "t1 is not null.
";
echo $t2->get()."
";
?>
t1变量被unset后,t1变成了null, 但是t2仍然还是指向原来的对象.
代码3:
class test{ function get(){return "aaaaa";} }
$t1 = new test();
$t2 = &$t1;
$t1 = null;
echo ($t1===null)? "t1 is null.
": "t1 is not null.
";
echo ($t1===null)? "t2 is null.
": "t2 is not null.
";
?>
t1=null后,t1变成了null, 可是t2竟然也变成了null
天啊,t1和t2的结果怎么会不一样呢? 折腾了半天才想明白, 通过"&" 引用的方式,实际上不应该叫做"引用",应该叫做"传址", 传址的概念在c语言里面是很明确的, 并且代码的书写方式是很类似的. 最开始,还以为这个和java里面对象引用的处理方式一样呢, 笨.....................啊!.
下面再来看看 php5 中的引用的方式吧.
代码4:
class test1{
public function aa(){
echo "aaaaaaaaaaa
";
}
public function __destruct(){
echo "game over!";
}
}
$t1 = new test1();
$t2 = $t1;
$t1 = null;
echo $t2->aa();
unset($t2);
?>
代码5:
class test1{
public function aa(){
echo "aaaaaaaaaaa
";
}
public function __destruct(){
echo "game over!";
}
}
$t1 = new test1();
$t2 = $t1;
unset($t1);
echo $t2->aa();
unset($t2);
?>
发现没有,代码4和代码5 的运行结果完全相同, 这个结果到是令人满意, 和java的对象引用的实现方式终于一致了.
--------------------------------------------------
结论, 结果证明php4的"&"这种方式是"传址", 而php5的默认的方式是"引用"(唠叨批).
在 php5 中引用对象的时候要根据实际的情况选择适当的引用的方式. 如果程序比较大,引用同一个对象的变量比较多,并且希望用完该对象后手工清除它,个人建议用 "&" 方式,然后用$var=null的方式清除. 其它时候还是用php5的默认方式吧. 另外, php5中对于大数组的传递,建议用 "&" 方式, 毕竟节省内存空间使用吗.

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

PHP 8.4 带来了多项新功能、安全性改进和性能改进,同时弃用和删除了大量功能。 本指南介绍了如何在 Ubuntu、Debian 或其衍生版本上安装 PHP 8.4 或升级到 PHP 8.4

CakePHP 是 PHP 的开源框架。它的目的是使应用程序的开发、部署和维护变得更加容易。 CakePHP 基于类似 MVC 的架构,功能强大且易于掌握。模型、视图和控制器 gu

Visual Studio Code,也称为 VS Code,是一个免费的源代码编辑器 - 或集成开发环境 (IDE) - 可用于所有主要操作系统。 VS Code 拥有针对多种编程语言的大量扩展,可以轻松编写
