4

PHP に、Python の属性/キー アクセスの魔法の一部を複製する方法があるかどうか疑問に思っていました。

私は、 Steve Laceyによって書かれたMinimongoと呼ばれるMongo ORM クラスを使用します。このクラスでは、 __getattr__andを利用して__getitem__キーと属性のフレーバー アクセスを再ルーティングし、Mongo の「ドキュメント指向」の性質を維持します。 val = doc.fooval = doc['foo']等価になります。

それを継承するクラスのオブジェクトアクセスの処理方法を変更できる同様のインターフェースがPHPにあるかどうか疑問に思っていました。私は STL を調べましたが、スーツを埋めたものは見つかりませんでした。デフォルトを設定するのに非常に役立ちます。ありがとう。

4

2 に答える 2

9

__get() と __set()ArrayAccessを見てください。

前者を使用すると、 のように非公開メンバーに$obj->fooアクセスできるようになり、後者を使用すると、 のようにアクセスできます$obj['foo']

内部で好きなように配線できます。

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

概念実証:

 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  

一貫性ミロード、まさにあなたが求めたとおりです。

于 2012-01-04T21:43:29.210 に答える
2

PHP の Magic Methods をご覧ください: http://php.net/manual/en/language.oop5.magic.php

__get()__set()そして__call()あなたが望むことをすることができます。

于 2012-01-04T21:42:34.063 に答える