欢迎大家访问我自己架的博客站点 !
遇到函数声明时前面加引用符号的情况。
调用函数时加引用符号可以理解,就是声明的接受变量是一个引用嘛。(实验证明,这是错的,说引用类型只能赋值给变量。What?不知所云,求指教。)可是函数声明就没有那么好理解了。php.net 中的例子:-----------------------------------------------<?phpclass foo { public $value = 42; public function &getValue() { return $this->value; }}$obj = new foo;$myValue = &$obj->getValue(); // $myValue is a reference to $obj->value, which is 42.$obj->value = 2;echo $myValue; // prints the new value of $obj->value, i.e. 2.?> 本例中 getValue 函数所返回的对象的属性将被赋值,而不是拷贝,就和没有用引用语法一样。-----------------------------------------------还是没太明白,试验先。eg 1、普通的函数声明,然后引用接收。[code]function foo() { $var = 0; return $var;}$get = & foo();var_dump($get);$get = 5;$get = & foo();var_dump($get);[/code]结果:Strict standards: Only variables should be assigned by referenceint 0Strict standards: Only variables should be assigned by referenceint 0eg 2、将上面例子中的函数声明成了引用返回。[code]function & foo() { $var = 0; return $var;}$get = foo();var_dump($get);$get = 5;$get = foo();var_dump($get);结果:int 0int 0和没有把函数声明成引用一样的效果。eg 3、将上面例子中的函数声明成了引用返回。[code]function & foo() { static $var = 0; return $var;}$get = & foo();var_dump($get);$get = 5;$get = & foo();var_dump($get);[/code]结果:int 0int 5eg 4、面向对象中引用返回的应用。[code]/** * 试验辅类,用于试验主类属性ref的->操作。 */class Ex { public $some; function __construct() { $this->some = 0; } public function set($v) { $this->some = $v; } public function get() { return $this->some; }}/** * 试验主类 */class MyClass { public $ref; function __construct() { $this->ref = & foo(); }}function & foo() { $var = new Ex; return $var;}$class = new MyClass();$class->ref->set(5);var_dump($class->ref->get());[/code]结果:int 5总结:1、一般来说,函数返回就是返回一个值。2、引用就是计算出变量的地址。3、引用返回是把返回变量的引用返回来了。而且,返回引用的格式决定了两边都要用 & 声明。 若只是在函数那边声明引用,那么返回结果将依然是赋值给接收变量。是不是就是返回一个变量拷贝呢? 若只是在接收变量那边声明引用就会报错,因为函数(还是返回的值?)不能用 & 求地址。