我这里有一个示例脚本,返回引用魔法__get:
class a{
public $_attributes = array();
function &__get($k){
if(isset($this->_attributes[$k])){
return $this->_attributes[$k];
}else{
return null;
}
}
function __set($k, $v){
$this->_attributes[$k] = $v;
}
}
$a = new a();
$a->username = "sam";
var_dump($a->username);
$u = $a->username;
$u = $u.'dddd';
var_dump($a->username);
var_dump($u);
通过引用从我的__get返回的想法是这样的,我可以这样做:
$this->user->ins[session_id()] = array(
"key"=>$_SESSION['server_key'],
"ip"=>$_SERVER['REMOTE_ADDR'],
"agent"=>$_SERVER['HTTP_USER_AGENT'],
"last_request"=>$_SERVER['REQUEST_URI'],
"last_active"=>new MongoDate(),
);
由于我不能正常使用PHP使用原始数组的副本。但是,当我将“用户名”说成新变量($ u)时,我不希望它传递其原始父项的引用。
上面的脚本打印出来:
string(3) "sam" string(3) "sam" string(7) "samdddd"
这很棒,因为它没有将$ username作为参考传回$ u,它的工作方式就像我想要的那样。
现在问题的时间:这是一个好方法吗? PHP中的预期行为是这样做的吗?
我一直在阅读用于引用的页面,但它有点不完整,但它确实提到告诉PHP $ u应该是一个引用我还必须在提取变量时使用引用符号(如此处所示) :http://php.net/manual/en/language.references.return.php)。
这是预期的行为,我可以在PHP中依赖它吗?还是有一些我看不到的可怕行为?
由于
答案 0 :(得分:1)
现在问题的时间:这是一个好方法吗?是预期的吗? 用PHP做的行为?
这是一种糟糕的(奇怪的)方法。简单地操纵对象,这是更常见的做法。你拥有它的方式很棘手,可能会在开发过程中误导你。
如果您决定继续使用参考方法,则需要确保通过引用收到该值。见下面的示例:
$a = new a();
// returning by reference is not enough, you need to receive by ref as well
$u =& $a->username;
答案 1 :(得分:0)
不是通过引用返回数组,而是返回ArrayObject
。
class Foo
{
private $data;
public function __construct()
{
$this->data = new ArrayObject();
}
public function __get($key)
{
return $this->data;
}
}
$foo = new Foo();
$foo->data['bar'] = 42;
var_dump($foo->data);
输出:
object(ArrayObject)#2 (1) {
["storage":"ArrayObject":private]=>
array(1) {
["bar"]=>
int(42)
}
}
不幸的是,PHP ArrayObject
不能直接用于PHP数组函数,但我更喜欢上述内容,而不是总是通过引用返回__get
。
如果将标签放在实现__toString()
的对象中,则可以对标量执行类似的操作。是的,这也存在缺陷,但我总是不鼓励通过引用使用__get
。