2012-04-16 3 views
0

私が参照魔法__getによる返品とここにスクリプトの例があります。参考明確化することによりPHP戻り

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)に "username"と言うと、元の親の参照を渡すことは望ましくありません。

上記のスクリプトを出力し:それはバック$ Uへの参照として$ユーザ名を渡していないと私はそれがしたいようにそれが動作becasue素晴らしいです

string(3) "sam" string(3) "sam" string(7) "samdddd" 

を。

今質問の時間:これは良いアプローチですか?これはPHPで期待される動作ですか?

私は参照のためのページを読んでいましたが、それは少しばかりですが、$ uは参照でなければならないことをPHPに伝えるために、変数を抜き出す際に参照記号も使用する必要がありますここに:http://php.net/manual/en/language.references.return.php)。

これは期待された動作であり、PHPでそれを使用することができますか、私は見ていない恐ろしいものがありますか?

おかげ

答えて

1

さて、質問のための時間:これは良いアプローチですか?これを行うには、PHPで の動作が期待されていますか?

これは悪い(奇妙な)アプローチです。オブジェクトを操作するだけで、より一般的な方法です。あなたが持っている方法は難しいし、開発中にあなたを誤解させる可能性があります。

参照方法を続行する場合は、参照によって値を受け取っていることを確認する必要があります。ただArrayObjectを返す代わりに、参照によって配列を返すの

$a = new a(); 
// returning by reference is not enough, you need to receive by ref as well 
$u =& $a->username; 
+0

infoありがとうございました: – Sammaye

0

:以下のサンプルを参照してください。

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 sがPHPの配列関数を直接使用することはできませんが、私は常に参照__getを返す上で上記を好むだろう。

スカラーの場合、__toString()を実装するオブジェクトにボックスを置くと、同様のことができます。そして、はい、これにも欠陥がありますが、私はいつも参考として__getを使用することをお勧めしません。

+0

これは私がそれを使用していた文脈がなくてもほとんどの場合動作します。アクティブなレコードモデルを構築していると仮定して、アクティブなレコードのすべての機能を必要としますが、NoSQLのための建物は動的な意味合いを意味するので、SQLのように「フィールドを取得する」ということはできないので、$ data属性が必要だと思います。これは私の質問が元来どこから来たのかです。参照で__getに渡すことで、実際のオブジェクトのような動的なスキーマを操作することができましたが、そのすべての機能も持っていました。 – Sammaye

+0

私は別の方法として、動的オブジェクト内のすべてのフィールドのkey =>名前を保持する$ _fields配列を格納することができます。これは、オブジェクト自身を操作することができ、変数名は$ _fields配列になります。 – Sammaye

関連する問題