【问题标题】:Aliasing a variable in PHPPHP中的变量别名
【发布时间】:2014-07-25 11:41:37
【问题描述】:

我有一个库类class someClass{....}。我为这个类创建了一个对象。

$objectA = someClass;

我想为$objectA 使用别名$objectB,因此我的课程更有意义。

PS:$objectB应该指向$objectA

【问题讨论】:

    标签: php class object alias


    【解决方案1】:
    $objectB = $objectA;
    

    来自the manual

    经常提到的 PHP 5 OOP 的一个关键点是 “对象默认通过引用传递”。这并不完全 真的。本节通过一些例子来纠正这种普遍的想法。

    PHP 引用是一个别名,它允许两个不同的变量 写入相同的值。自 PHP 5 起,对象变量没有 不再包含对象本身作为值。它只包含一个对象 允许对象访问者找到实际对象的标识符。 当一个对象通过参数发送、返回或分配给另一个对象时 变量,不同的变量不是别名:它们持有 标识符,指向同一个对象。

    <?php
    class A {
        public $foo = 1;
    }  
    
    $a = new A;
    $b = $a;     // $a and $b are copies of the same identifier
                 // ($a) = ($b) = <id>
    $b->foo = 2;
    echo $a->foo."\n";
    
    
    $c = new A;
    $d = &$c;    // $c and $d are references
                 // ($c,$d) = <id>
    
    $d->foo = 2;
    echo $c->foo."\n";
    
    
    $e = new A;
    
    function foo($obj) {
        // ($obj) = ($e) = <id>
        $obj->foo = 2;
    }
    
    foo($e);
    echo $e->foo."\n";
    
    ?>
    

    上面的例子会输出:

    2
    2
    2
    

    【讨论】:

      【解决方案2】:

      我喜欢约翰·康德的回答。我想添加以下内容(使其更直接):

      在 PHP 中,几乎任何东西都可以“引用”。对于像我这样来自 C 和 ASM 技术编程的老手来说,它与“指针”的概念类似。

      “指针”是内存中某物的物理位置的地址。通过了解它,您可以在不使用上下文中的变量的情况下引用该内容。

      在 PHP 中,如果您在对象、结构或变量前面加上符号“&”,您就是在告诉解释器您想要的是内容的引用,而不是内容本身。当将它与另一个对象、结构或变量相关联时,PHP 解释器不会在另一个内存分配点复制它,而是将它引用到与原始内存位置相同的内存位置。主要是,你最终会得到两个指向 RAM 中相同位置的项目。

      您可以像这样在 PHP 中引用变量、结构和对象:

          $variable = "Variable Content";
          $alias = &$variable;
          echo $alias;
      

      上面的代码应该打印Variable Content

      请注意$alias = &amp;$variable;$alias = $variable; 不同(没有“&”)。在第一种情况下,PHP 会将$variable 的内容复制到$alias 中,并且您将在不同变量指向的RAM 的不同位置有两个相同的值。第二种情况,使用“&”,是单个内容,有两个独立的指针,但引用 RAM 中的相同位置。

      与两个特定变量的情况类似,如果您取消设置其中任何一个($variable$alias),它不会取消设置引用,这意味着另一个将继续工作。但是,如果您修改任何内容,它会同时修改这两个变量的内容,因为它们在 RAM 中查找相同的物理位置以在使用时检索内容。

      把它想象成类似于 Unix 的 unlink 调用。相同的规则适用于对象和结构。一切都可以参考。

      而且,是的,您可以对同一个内容有多个引用。

      如果您现在突然想到“垃圾回收”(GC) 的噩梦,那么您明白了。 :)

      更多信息请访问https://www.php.net/manual/en/language.references.php

      它们在概念上相似,仅在实现和语言模型方面有所不同:

      引用 = 别名 = 指针

      【讨论】:

        猜你喜欢
        • 2022-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-20
        • 1970-01-01
        • 2022-07-14
        • 1970-01-01
        相关资源
        最近更新 更多