【问题标题】:PHP Reference behavior in VARIABLES and CLASSES (that are formed by reference)- are they different or the same?VARIABLES 和 CLASSES 中的 PHP 引用行为(由引用形成)- 它们是不同的还是相同的?
【发布时间】:2009-10-04 21:31:21
【问题描述】:

在 PHP 中,引用变量会在 1 或另一个更改时同时修改。

新类由隐式引用形成,但修改扩展并不会修改父类。

这是 PHP 的设计,还是它们是不同类型的“引用”?

【问题讨论】:

  • 你能澄清你的问题吗?
  • 是的 - 如果我创建一个新变量 z 它是对变量 x 的引用,那么更改 z 的值会将 x 更改为相同的值,对吗?反之亦然——改变 x 的值会改变 z 的值,对吗?为什么对于通过引用形成的类来说不是这样?如果我通过扩展ParentClass创建一个名为ChildClass的新类,然后更改ChildClass,ParentClass不变!与基于参考变量的第一个示例进行比较时,这没有意义。

标签: php reference


【解决方案1】:

您将子类化(扩展)与引用混淆了。

这是扩展,就是你描述的:

class ParentClass{ };
class ChildClass extends ParentClass { };

$parent = new ParentClass;
$child = new ChildClass;

$parent->setName('Dad');
$child->setName('Daughter');

echo $parent->name;
// Dad

这实际上是您想要描述的吗?

通过引用传递变量/类是完全不同的对话,并且与子类化/扩展类的想法没有真正的联系。它的工作原理更像这样。

$parent = new ParentClass;
$child = new ChildClass;

$childRef = $child; // $childRef isn't a copy, it's a reference to $child.
$childRef->setName('Daughter');

echo $child->name;
// Daughter
// Notice that it's the same as if you had called setName( ) on $child itself;

【讨论】:

    【解决方案2】:

    PHP 中的引用是一种奇怪的结构。 $a =& $b; 使 $a 成为对 $b 的引用。这意味着每当$b 的值发生变化时,$a 都会反映该变化。或者换一种说法,$a 将始终与$b 具有相同的值。

    在 PHP 4 中,对象在分配时会被隐式克隆。例如。如果$b 是一个对象,代码$a = $b 将创建一个新对象,它是$b 的副本,并将其分配给$a。这是一个相当大的问题,因为您通常需要对象的引用语义。为了解决这个问题,您必须在处理对象时使用引用。自 PHP 5 以来,这已经改变,所以今天很少有情况(如果有的话)应该使用引用。

    【讨论】:

      猜你喜欢
      • 2012-03-04
      • 2011-09-03
      • 2012-07-21
      • 1970-01-01
      • 2013-12-27
      • 2015-06-29
      • 1970-01-01
      • 2018-07-30
      • 1970-01-01
      相关资源
      最近更新 更多