2012-01-04 4 views
4

Pythonの属性/キーアクセスの魔法をいくつか複製する方法がPHPにあるかどうか疑問に思っていました。Pythonの魔法へのPHPのアプローチ__getattr __()

私は彼がキー再ルーティングと風味のアクセス属性とモンゴの「ドキュメント指向の」自然を維持するために__getattr____getitem__を利用するにMinimongo呼ばSteve Laceyによって書かれたMongoのORMクラスを使用します。 val = doc.fooval = doc['foo']は同等になります。

PHPから継承するクラスのオブジェクトアクセスをどのように処理するかを変更できるようなPHPのインターフェイスがあるかどうかは疑問でした。私はSTLを見渡し、訴訟に満ちたものを見つけることができませんでした。これは、デフォルト設定に非常に役立ちます。ありがとう。

+0

+ + + + + + + + + + + + + + + + + + – Flavius

答えて

9

__get() and __set()ArrayAccessをご覧ください。

前者では、$obj->fooのように非公開のメンバーをアクセスビルにすることができ、後者では$obj['foo']のようにアクセスできます。

あなたは内部で好きなようにハードワイヤリングすることができます。

個人的には、これらの魔法のようにアクセス可能なプロパティをクラスの1つの配列メンバーに保存することをお勧めします。そうすれば、スパゲッティコードで終わることはありません。

POC:

1 <?php 
2 class Magic implements ArrayAccess { 
3 
4  protected $items = array(); 
5 
6  public function offsetExists($key) { 
7   return isset($this->items[$key]); 
8  } 
9  public function offsetGet($key) { 
10   return $this->items[$key]; 
11  } 
12  public function offsetSet($key, $value) { 
13   $this->items[$key] = $value; 
14  } 
15  public function offsetUnset($key) { 
16   unset($this->items[$key]); 
17  } 
18 
19  //do not modify below, this makes sure we have a consistent 
20  //implementation only by using ArrayAccess-specific methods 
21  public function __get($key) { 
22   return $this->offsetGet($key); 
23  } 
24  public function __set($key, $value) { 
25   $this->offsetSet($key, $value); 
26  } 
27  public function __isset($key) { 
28   return $this->offsetExists($key); 
29  } 
30  public function __unset($key) { 
31   $this->offsetUnset($key); 
32  } 
33 } 
34 
35 //demonstrate the rountrip of magic 
36 $foo = new Magic; 
37 $foo['bar'] = 42; 
38 echo $foo->bar, PHP_EOL;//output 42 
39 $foo->bar++; 
40 echo $foo['bar'];//output 43 
41 

一貫ミロード、あなたが尋ねたとおりに。

+0

これは完璧に機能しました。基本的には、json_decodeの呼び出しからstdClassを受け取り、このようなアクセスを許可するクラスを作成しましたが、キーが存在しない場合はデフォルトでfalseを返します。 Schemalessデータには、これが必要です。これは私のPHPでこのフェイルセーフを持っている負担を実際に取り除きます...私はPythonでそれを愛しています。 – DeaconDesperado

関連する問題