太原PHP培训
达内太原php培训中心

0351-5608878

热门课程

php中 global/static 的一个小陷阱的解释

  • 时间:2016-11-18
  • 发布:蝦米的技术手札
  • 来源:蝦米的技术手札

php中 global/static 的一个小陷阱的解释

php手册中,关于global/static变量有这么一段说明

Zend 引擎 1 代,它驱动了 PHP4,对于变量的 static global 定义是以引用的方式实现的。例如,在一个函数域内部用 global 语句导入的一个真正的全局变量实际上是建立了一个到全局变量的引用。这有可能导致预料之外的行为,如以下例子所演示的:

function test_global_ref() {

global $obj;

$obj = &new stdclass;

}

function test_global_noref() {

global $obj;

$obj = new stdclass;

}

test_global_ref();

var_dump($obj);

test_global_noref();

var_dump($obj);

上面这段代码的输出是:

NULL

object(stdClass)(0) {

}

很多人也许会纠结为什么第一个会是 null ,并且开始纠结是不是因为用了过时(并且从php7开始已经被移除)的特性 Assigning the return value of new by reference 所导致的。然而事实并非如此,让我们把上面这个例子稍作改动:

function test_global_ref() {

global $obj;

$b = 'xiami';

$obj = &$b;

}

function test_global_noref() {

global $obj;

$b = 'xiami';

$obj = $b;

}

test_global_ref();

var_dump($obj);

test_global_noref();

var_dump($obj);

这是一个在目前最新的php(php 7.0.13)下依然可以无任何错误运行的一段代码,它的第一个输出的结果依然是 null ,为什么?

再回过头读一遍手册上的解释, 在一个函数域内部用 global 语句导入的一个真正的全局变量实际上是建立了一个到全局变量的引用 ,换言之 global $obj; $obj = &$GLOBALS['obj']; 是完全等价的

好了,今天就给大家讲这么多吧,喜欢我的内容可以关注或者分享(微信公众平台:tytedu)选择太原达内培训,不再孤军奋战,轻轻松松做IT高薪白领。太原达内培训带领有明确目标的学子迈向成功之路!

上一篇:前端与PHP之间那点儿事(二)
下一篇:CmlPHP V2.7.2,快速稳定易维护的 PHP 框架福利

PHP中十六个魔术方法详解(三)

JavaScript 与 Java、PHP 的比较

太原php培训资源站

太原PHP编程开发并发编程槽与坑

选择城市和中心
贵州省

广西省

海南省