0

我在这里有一个示例脚本,通过引用魔术 __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 中依赖它还是有什么可怕的东西我没有看到?

谢谢

4

2 回答 2

1

现在是时候提出问题了:这是一个好方法吗?PHP中的预期行为是这样做的吗?

这是一种不好(奇怪)的方法。简单地操作对象,这是比较普遍的做法。你拥有它的方式很棘手,并且可能会在开发过程中误导你。

如果您决定继续使用参考方法,则需要确保您通过参考获得了价值。请参阅下面的示例:

$a = new a();
// returning by reference is not enough, you need to receive by ref as well
$u =& $a->username;
于 2012-04-16T15:54:13.333 回答
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)
  }
}

不幸ArrayObject的是,PHP 不能直接与 PHP 数组函数一起使用,但我更喜欢上面的方法,而不是总是__get通过引用返回。

如果将标量封装在实现__toString(). 是的,这也有缺陷,但我总是不鼓励__get通过引用使用。

于 2012-05-18T23:34:45.520 回答