php5学習記録(2)
1. 過負荷パフォーマンス
1. 属性とメソッドのオーバーロード
php では、特別なプロキシ メソッドを実装することで、プロパティ アクセスとメソッド呼び出しのオーバーロードが可能になり、関連するプロパティまたはメソッドが存在しない場合にこれらのプロキシ メソッドが呼び出されます。この機能により、これらのアクションを仲介し、独自の機能を定義する際に非常に柔軟な対応が可能になります。
次のメソッド プロトタイプを実装できます:
function __get($property) // プロパティの名前を渡し、プロパティの値を返します
function __set($property, $value) // プロパティ名と新しい値を渡します
function __call($method, $args) // メソッドの名前と数値インデックスの配列を渡します。数値には、渡されたパラメーターのインデックスが含まれます。最初のパラメータは 0 です。
?
?
class Users { private $arr = array(); function __get($name) { return $this->arr[$name] === NULL ? 'null' : $this->arr[$name]; } function __set($name, $value) { $this->arr[$name] = $value; } } $user = new Users(); $user->a = 'xiezheng'; print $user->a;
__call() は、主にオブジェクト内の他のメソッドを監視するために使用されます。オブジェクトに存在しないメソッドを呼び出そうとすると、__call メソッドが自動的に呼び出されます。
?
class HelloWorld { function display($count) { for($i=0; $i<$count; $i++) print __CLASS__.'<br />'; return $count; } } class HelloWorldCall { private $obj; function __construct() { $this->obj = new HelloWorld(); } function __call($method, $args) { return call_user_func_array(array($this->obj, $method), $args); } } $hwc = new HelloWorldCall(); print $hwc->display(3);
?
2. 配列ステートメントアクセスを使用したオーバーロード。
クラスで配列ステートメントへのアクセスをオーバーロードするには、クラスで ArrayAccess インターフェイスを実装する必要があります。
bool offsetExists($index)
マイニングされた offsetGet($index)
void offsetSet($index, $new_value)
void offsetUnset($index)
上記は ArrayAccess が実装する必要があるメソッドです。
?
?
class Users implements ArrayAccess { private $uname; function offsetExists($name) { return $this->uname === NULL; } function offsetGet($name) { return $this->offsetExists($this->uname) ? 'NULL' : $this->uname; } function offsetSet($name, $value) { $this->uname = $value; } function offsetUnset($name) { $this->uname = null; } } $user = new Users(); $user['name'] = 'xiezheng'; // unset($user['name']); print $user['name'];
?
?