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)
  }
}

残念ながら、PHPArrayObjectを PHP 配列関数で直接使用することはできませんが、常に__get参照によって返されるよりも上記の方法をお勧めします。

を実装するオブジェクトにボックス化すると、スカラーに対して同様のことができます__toString()。はい、これにも欠陥がありますが、__get参照による使用は常に思いとどまらせます。

于 2012-05-18T23:34:45.520 に答える