2011-06-18 6 views
3

私はクラスにあいまいな変数を設定しようとしています。これらの線に沿ったもの:php magic method __set

<?php 
    class MyClass { 
    public $values; 

    function __get($key){ 
     return $this->values[$key]; 
    } 

    function __set($key, $value){ 
     $this->values[$key]=$value; 
    } 
    } 

    $user= new MyClass(); 
    $myvar = "Foo"; 
    $user[$myvar] = "Bar"; 
?> 

これは方法ですか?

+1

PHPは流行っていませんか? lol – AntonioCS

+0

最近、どの言語が流行っているのか教えてください。私は流行の言語を学び、流行のコードを書いてほしい。 –

答えて

3

ので、同様に:あなたが使用したいhttp://ideone.com/gYftr

$instance->$dynamicName 
+0

私はそれを試していないとは信じられません。ありがとうございましたminitech。 – Pardoner

1

あなたが持つメンバ変数へのアクセス - >演算子を。

$user->$myvar = "Bar"; 
4

(それはを飛び出し作るためにまたは$instance->{$property}$instance->$propertyを述べてきたように

あなたが本当に、配列のインデックスとしてアクセスArrayAccessインタフェースを実装し、offsetGet()offsetSet()を使用したい場合など。

class MyClass implements ArrayAccess{ 
    private $_data = array(); 
    public function offsetGet($key){ 
     return $this->_data[$key]; 
    } 
    public function offsetSet($key, $value){ 
     $this->_data[$key] = $value; 
    } 
    // other required methods 
} 

$obj = new MyClass; 
$obj['foo'] = 'bar'; 

echo $obj['foo']; // bar 

警告offsetGetを参照渡しとして宣言することはできません。ただし、$_dataプロパティのネストされた配列要素へのアクセスを、読み取りと書き込みの両方に許可することが可能なのは__get()です。

class MyClass{ 
    private $_data = array(); 
    public function &__get($key){ 
     return $this->_data[$key]; 
    } 
} 

$obj = new MyClass; 
$obj->foo['bar']['baz'] = 'hello world'; 

echo $obj->foo['bar']['baz']; // hello world 

print_r($obj); 

/* dumps 
MyClass Object 
(
    [_data:MyClass:private] => Array 
     (
      [foo] => Array 
       (
        [bar] => Array 
         (
          [baz] => hello world 
         ) 

       ) 

     ) 

)