インターセプターは、未定義のメソッドおよびプロパティに送信されたメッセージをインターセプトできます。
__get($property) ----访问未定义的属性时调用__set($property,$value) ----给未定义的属性赋值时被调用__isset($property) ----对未定义的属性调用isset()时被调用__unset($property) ----对未定义的属性调用unsettle()时调用__call($property) ----对未定义的方法时调用其实还有一个__callstatic ----对未定义的静态方法时调用
例:
< ?phpclass Person { private $_name; //设置了一个私有属性 function __set($property,$value){ //这里是__set方法 $method = "set{$property}"; //这里其实就是$method = "setname",{}是php的执行代码语法,所以直接解析变量 if(method_exists($this, $method)){ //判断是否存在这个方法 return $this->$method($value); //这里->$method其实就是以一个变量值为变量名的变量,其实就是会直接解析这个变量,即$this->setname(解析$method出来就是setname) } } function __get($property) { //get差不多 $method = "get{$property}"; if(method_exists($this, $method)){ return $this->$method(); } } function test() { //这里为了测试set之后的值 echo $this->_name; } function setName($name) { $this->_name = $name; } function getName() {//因为php不区分大小写,所以getname和getName是一样的 echo "bobbbbbb"; }}$p = new Person();$p->name = "bob";$p->test(); 结果是bob-----------------echo $p->name;结果是bobbbbbb?>
2 つのパラメータを受け入れます。1 つは、メソッドでは、呼び出されるメソッドのすべてのパラメータ (配列) が渡され、実際のメソッドを呼び出す場合と同様に、__call によって返される値がクライアントに返されます。プロセス全体はかなり複雑で、委任に似た実装があります (委任とは、オブジェクトがリクエストを別のオブジェクトに転送または委任することを意味し、委任された側は元のオブジェクトを使用してリクエストを処理します)。 person オブジェクトをインスタンス化し、インスタンス プロセス中に personwriter オブジェクトが渡されます (__construct で必要なため)。その後、__construct がこのオブジェクトを $writer 変数に割り当てます。 $writer を呼び出すと、実際には personwriter オブジェクトが呼び出されます。オブジェクト内の writeName の場合、writeName メソッドは person オブジェクトを渡す必要があるため、$this が渡されます。 writeName が正常に実行されると、getName が正常に実行されます。
出力: bob
部分参照: http://blog.sina.com.cn/s/blog_978469a60101792i.html