Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如果对象是通过别名传递的,您什么时候会通过引用传递?_Php - Fatal编程技术网

Php 如果对象是通过别名传递的,您什么时候会通过引用传递?

Php 如果对象是通过别名传递的,您什么时候会通过引用传递?,php,Php,可能重复: 据 PHP5OOP中经常提到的一个关键点是“默认情况下对象是通过引用传递的”。这并不完全正确。本节通过一些例子纠正了这一总体思路 PHP引用是一个别名,它允许两个不同的变量写入相同的值。从PHP5开始,对象变量不再包含对象本身作为值。它只包含一个允许对象访问器查找实际对象的对象标识符。当一个对象通过参数发送、返回或分配给另一个变量时,不同的变量不是别名:它们持有指向同一对象的标识符副本 如果对象是通过别名或处理程序传递的,那么在什么情况下您实际希望通过引用传递 myFunc($ob

可能重复:

PHP5OOP中经常提到的一个关键点是“默认情况下对象是通过引用传递的”。这并不完全正确。本节通过一些例子纠正了这一总体思路

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

如果对象是通过别名或处理程序传递的,那么在什么情况下您实际希望通过引用传递

myFunc($obj); // Pass by alias/handler

myFunc(& $obj); // Pass by reference (when would you do this?)

myFunc(clone $obj); // Create a new object
每一个都有哪些不同的用例

每一个都有哪些不同的用例

您已经命名了三个不同的用例:

  • 将对象作为参数传递
  • 将别名作为参数传递
  • 将对象克隆作为参数传递
  • 当然,当你需要做具体的案例时,你会做这三件事中的每一件。您通常只需要1。99.9%。需要时,您可以执行其他0.1%的操作

    变量别名作为参数的示例用例(如注释中所要求的),作为一个小示例():


    将对象指定给方法时,将传递对现有对象的引用,以便调用范围中的变量和方法范围中的方法参数变量都引用同一对象

    您可以显式地使用&来提供对诸如数组之类的基元的引用,以便调用的方法可以更改原始数组的数据。对于对象,这是您提到的当前默认设置

    克隆人似乎是显而易见的

    使用&$obj可以创建$obj的别名,而不是$obj引用的对象的引用。引用php.net:

    $c = new A;
    $d = &$c;
    $c->foo = 2;
    $c = NULL;
    echo $d->foo."\n"; // Notice:  Trying to get property of non-object...
    
    myfunc($obj)//传入标识符

    当函数需要访问对象并以某种方式操纵/读取对象时

    myfunc(&$obj)//传入对标识符的引用

    这里的关键是传递对标识符的引用。这意味着如果外部变量($obj)设置为null,那么内部对象也将变为null,因为您已从$obj中删除了标识符,因此对它的引用也已删除。与传入标识符不同,因为您实际执行的操作是传入标识符的副本,因此如果$obj设置为null,则函数中的值仍将指向对象

    例如:

    var x = new Object();
    
    var y = x //y and x both contain **different** identifiers to the same object in memory.
    
    function a($_a){} // a function for examples
    
    a($y) // passes in a copy of $y so $_a (inside the function) is a third identifier pointing to th in memory object
    
    a(& $y) // now $_a contains the **same** identifier as $y so if either is emptied then the other is also emptied. 
    
    a(clone $y) //creates a new object identical to the first and passes in an identifier of the new object.
    
    希望这足够清楚


    如果希望能够从函数内部修改或删除标识符,并使其影响外部标识符变量,同时能够返回独立计算的值,则可以通过引用传递标识符。e、 g序列化一个对象,将其保存到一个文件中。返回文件字符串,同时清除标识符,以便从内存中清除该对象。

    我认为本课程涵盖了以下主题:(除其他外)注意,调用时间传递引用至少从5.3(如果不是更早的话)起就被弃用了。该函数声明它希望哪些参数是引用,调用方不必指定它们是引用——事实上,也不应该这样做。您知道
    myFunc(&$obj)
    的具体用例是什么吗?它专门将变量别名作为参数传递。因此,您可以用另一个名称引用同一个变量。@Dev我是专门询问对象及其在传递到函数中时的行为,而不是字符串之类的基本体。如果您传递引用,则更多的是关于变量名称而不是实际值。@MikeB:我添加了一些示例代码,说明这些别名可以使用什么。
    var x = new Object();
    
    var y = x //y and x both contain **different** identifiers to the same object in memory.
    
    function a($_a){} // a function for examples
    
    a($y) // passes in a copy of $y so $_a (inside the function) is a third identifier pointing to th in memory object
    
    a(& $y) // now $_a contains the **same** identifier as $y so if either is emptied then the other is also emptied. 
    
    a(clone $y) //creates a new object identical to the first and passes in an identifier of the new object.