讨论变量,静态变量,变量的引用,全局变量,以及占用资源的关系

引用赋值、传值赋值

  很多人误解php中的引用跟C当中的指针一样,事实上并非如此,而且很大差别。

  C语言中的指针除了在数组传递过程中不用显式申明外,其他都需要使用*进行定义,而php中对于地址的指向功能不是由用户自己来实现的,是由Zend核心实现的,php中引用采用的是“写时复制”的原理。除非发生写操作,指向同一个地址的变量或者对象是不会被拷贝的。

$a = array('a','c'...'n');
$b = $a;
// $a 和 $b 指向的是同一块内存空间

  如果程序仅执行到这里,$a和$b是相同的,但是并没有像C那样,$a和$b占用不同的内存空间,而是指向了同一块内存,这就是php和c的差别。并不需要写成 $b = &$a,zend就已经帮你实现了引用。

$a = array('a','c'...'n');
$b = $a;
printArray($a);

function printArray( &$arr ) { //引用传递
    print(count($arr));
}

//Zend会为$b重新开辟一块内存空间储存值,因为$a的值有可能会被改变。写时复制

  如果上面的代码直接传递$a值到printArray()中,此时并不存在引用传递,所以没有出现写时复制。

  大家可以测试一下上面两行代码的执行效率,比如外面加入一个循环1000次,看看运行的耗时,结果会让你知道不正确使用引用会导致性能下降30%以上。而在论坛看到却是用&来引用可以减少"拷贝",减少资源。

引用返回、实例化引用、直接引用.

//引用返回
function &test($d){
    return $d;
}
//实例化引用 $xml = &new xml_object::create('书','书的介绍',array("备注"=>'书是智慧之书'));
//直接引用 $xml = &xml_object::create('书','书的介绍',array("备注"=>'书是智慧之书'));
* 从函数返回一个引用,必须在函数声明和指派返回值给一个变量时都使用引用操作符 & 

未完待续 http://blog.sina.com.cn/s/blog_694c144f0100ymsl.html

原文地址:https://www.cnblogs.com/mysic/p/4872383.html