为什么以下
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
类型?
答案 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"
答案 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 );