我正在通过阅读PHP官方文档来学习面向对象的php。
首先:
class SimpleClass
{
// property declaration
public $var = 'a default value';
// method declaration
public function displayVar() {
echo $this->var;
}
}第二:
$instance = new SimpleClass();
$assigned = $instance;
$reference =& $instance;
$instance->var = '$assigned will have this value';
$instance = null; // $instance and $reference become null
var_dump($instance);
var_dump($reference);
var_dump($assigned);结果:
NULL
NULL
object(SimpleClass)#1 (1) {
["var"]=>
string(30) "$assigned will have this value"
}这个例子我不太理解reference and value给出的
在这里,我看到了output.But的结果,我还是不明白。
我的问题是为什么$instance和$reference会变成空?
发布于 2011-04-06 17:04:00
我的问题是为什么$instance和$reference会变成空?
PHP引用以一种有趣的方式运行。我要做一个真实的类比。
想象一下你有一个杯子。杯子里装满了水。
杯子是一个变量。水是变量的内容。
你创建的任何引用都指向杯子,而不是水。
如果您将杯子中的水替换为咖啡,那么所有对该杯子的引用都会突然包含相同的咖啡。
当你清空杯子的时候,所有对杯子的引用突然都是空的。
现在,对象变得非常有趣。你看,当你把它们赋值给变量时,它实际上是通过引用来实现的。但是objects by-ref不是普通的引用。在PHP交互式提示符下:
php > class Foo { public $bar; }
php > $f = new Foo();
php > $f->bar = 1;
php > $f_copy = $f;
php > $f_copy->bar = 2;
php > echo $f->bar;
2不是你想要的,对吧?变得更有趣了。
php > $f_copy = $f;
php > $copy_ref = &$f_copy;
php > $copy_ref->bar = 3;
php > echo $f->bar;
3这是一个更多的预期。但这是真的吗?
php > $f_copy = null;
php > print_r($copy_ref);
php > var_export($copy_ref);
NULL
php > print_r($f);
Foo Object
(
[bar] => 3
)正如您所看到的,即使我们完全清空了包含对对象的引用的变量,原始对象仍然保持不变,即使该对象是通过引用放入副本中的!
欢迎来到PHP,在这里这样的事情是正常的。我建议经常检查你自己的理智。
编辑:哦,还有一件事。如果需要制作对象的真实副本,则必须对其执行clone操作:
php > $not_f = clone $f;
php > $not_f->bar = 'I am not $f';
php > echo $f->bar;
3
php > echo $not_f->bar;
I am not $f它也适用于refs:
php > $not_f_copy = $not_f;
php > $not_copy_ref = &$not_f_copy;
php > $headsplode = clone $not_copy_ref;
php > $not_f->bar = 'No, I am Spartacus!';
php > echo $headsplode->bar;
I am not $f哦,在有人问之前:在一些语言中,引用是在值级别工作的,而不是在变量级别。Perl就是一个很好的例子。如果创建了对变量的引用,然后重新分配原始变量,则引用仍包含原始值。我是通过Perl接触PHP的,这个看似很小的差异让我非常恼火。
https://stackoverflow.com/questions/5563658
复制相似问题