我似乎无法得到任何一致的信息.不同的来源似乎说不同的东西和古老的php.net本身(似乎)没有明确说明这一点 - 虽然,我必须承认,我只是快速看.
如果我在传递'重'对象,我需要通过引用传递,但我不想继续输入:
function foo(TypeName& $obj)
Run Code Online (Sandbox Code Playgroud)
如果我可以简单地逃脱
function foo(TypeName $obj)
Run Code Online (Sandbox Code Playgroud)
那标准说的是什么?
web*_*ave 89
通过引用传递(和分配)对象.无需使用运营商的地址.
当然,我输入的内容过于简单,但适合您的目的.该文件规定:
经常提到的PHP5 OOP的关键点之一是"对象默认通过引用传递".这不完全正确.本节使用一些例子来纠正这种一般思想.
PHP引用是一个别名,它允许两个不同的变量写入相同的值.从PHP5开始,对象变量不再包含对象本身作为值.它只包含一个对象标识符,允许对象访问者查找实际对象.当一个对象通过参数发送,返回或分配给另一个变量时,不同的变量不是别名:它们包含标识符的副本,该副本指向同一个对象.
有关更详细的说明(解释过度简化以及标识符),请查看此答案.
从PHP手册:
您可以通过引用函数传递变量,以便函数可以修改变量.语法如下:
Run Code Online (Sandbox Code Playgroud)<?php function foo(&$var) { $var++; } $a=5; foo($a); // $a is 6 here ?>注意:函数调用上没有引用符号 - 仅在函数定义上.单独的函数定义足以通过引用正确传递参数.从PHP 5.3.0开始,当您在foo(&$ a);中使用&时,您将收到一条警告,指出"call-time pass-by-reference"已弃用.
在PHP 5中,对象模型的基础结构被重写以使用对象句柄.除非您使用clone关键字显式克隆对象,否则您将永远不会在对象的场景重复项后面创建.在PHP 5中,既不需要通过引用传递对象也不需要通过引用分配它们
因此,只有function foo(&$var)当$ var可能不是类的实例时,才需要使用该语法.
小智 5
它看起来更精确一点,对象的值是通过值传递的,但是对象本身的值是一个指针.这与仅传递引用不同.
在http://www.php.net/manual/en/language.oop5.references.php上列出的示例很好.在第一组中,$ a = NULL; 不会影响$ b,因为$ a只是一个指针.在第二组中,$ c = NULL; 导致$ d也为NULL,因为$ d是对$ c的引用.
<?php
class A {
public $foo = 1;
}
$a = new A;
$b = $a;
$a->foo = 2;
$a = NULL;
echo $b->foo."\n"; // 2
$c = new A;
$d = &$c;
$c->foo = 2;
$c = NULL;
echo $d->foo."\n"; // Notice: Trying to get property of non-object...
?>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
33648 次 |
| 最近记录: |