PHP的引用分配没有按预期工作

时间:2014-04-08 12:50:03

标签: php reference

为什么以下

class AClass
{
    public function __construct ()
    {
        $this->prop = "Hello";
    }
    public function &get ()
    {
        return $this->prop;
    }
    protected $prop;
}

function func (&$ref)
{
    $ref = &$ref->get();
}

$value = new AClass();
func($value);
var_dump( $value );

输出

object(AClass)#2 (1) {
  ["prop":protected]=>
  string(5) "Hello"
}

$value变量是否应该成为对$prop的引用并且属于string类型,而不是保留AClass类型?

http://ideone.com/g1hTNV

7 个答案:

答案 0 :(得分:2)

考虑这段代码(它与你的代码相同,只是没有其他代码):

$value = new stdClass;
$ref = &$value;
$var = "Hello";
$ref = &$var; // this is where you write $ref = &$ref->get();
var_dump($value);

这为提供了一个空对象,而不是 string(5) Hello

为什么?

我们在第4行覆盖$value的引用时引用$var

$ref现在提到$var; $value的值仍然不受影响

我们没有做什么

  • 我们不会将$var的值分配给$value
  • 我们不会将$value分配给$var

结论

在PHP中无法通过另一个引用变量分配对变量的引用。

答案 1 :(得分:0)

bwoebi关于PHP引用如何工作是完全正确的。如果没有dereference运算符,就不可能确切地知道使用指针时的意思,因此PHP使用了另一种方法。然而,这并不意味着你想要的东西是不可能的,你只是不能在一个函数内完成所有这些:

class AClass
{
    public function __construct ()
    {
        $this->prop = "Hello";
    }
    public function &get()
    {
        return $this->prop;
    }
    public $prop;
}

function &func($ref)
{
    return $ref->get();
}

$root = new AClass();
$value = &func( $root );
var_dump( $value );
  // string(5) "Hello"
$value = "World";
var_dump( $root->get() );
  // string(5) "World"

http://codepad.org/gU6pfzUO

答案 2 :(得分:-1)

您应该删除func功能中的&符号。然后它会返回字符串。

function func (&$ref)
{
    $ref = $ref->get();
}

答案 3 :(得分:-1)

为了测试,只需将protected更改为public。

$value = new AClass();
$myValue = &$value->get();

var_dump($myValue );
var_dump($value->prop);
$value->prop = 'test';
var_dump($value->prop);
var_dump($myValue );

输出:

 string 'Hello' (length=5)
 string 'Hello' (length=5)
 string 'test' (length=4)
 string 'test' (length=4)

如果您认为函数是必要的,您可以使用全局变量。

答案 4 :(得分:-1)

你想要的是什么 -

 <?php
class AClass
{
    public function __construct ()
    {
        $this->prop = "Hello";
    }
    public function &get ()
    {
        return $this->prop;
    }
    protected $prop;
}

function func (&$ref)
{
   $ref= $ref->get();

}

$value = new AClass();
func($value);
print_r( $value );
 ?>

答案 5 :(得分:-1)

class AClass
{
    public function __construct ()
    {
        $this->prop = "Hello";
    }
    public function &get ()
    {
        return $this->prop;
    }
    protected $prop;
}

function func (&$ref)
{
    $ref = $ref->get(); // You don't need the ampersand here
}

$value = new AClass();
func($value);
var_dump( $value ); // outputs: string(5) "Hello"

答案 6 :(得分:-2)

你的函数func()需要返回一个值,然后它需要为变量分配func()返回的内容。请参阅以下修改后的代码:

function func (&$ref) {
    $ref = &$ref->get();
    return $ref;
}

$value = new AClass();
$new_value = func($value);
var_dump( $new_value );