<?php
class Packer{
var $packin;
public function __construct(&$packin){
$this->packin=$packin;
}
public function __tostring(){
return "[Packer]";
}
protected function __get($k){ 
$funcName='get'.ucfirst($k);
if(is_callable(array($this,$funcName))){ //注释a
return $this->$funcName();
}
return $this->packin->$k;
}
protected function __set($k,$args){
$funcName='set'.ucfirst($k);
if(is_callable(array($this,$funcName))){ //注释b
call_user_func_array(array($this,$funcName),$args);
return;
}
$this->packin->$k=$args;
}
protected function __call($k,$args){
if(is_callable(array($this->packin,$k))){
return call_user_func_array(array(&$this->packin,$k),$args);
}
}
}
class Product{
var $price;
}
class Book extends Packer{
function setName($s){
echo("set name $s");
}
}
$p=new Product();
$p->price=120;
$book=new Book($p);
$book->name="c++ primer";
echo($book->price);
?>
类Pack用来包装一个对象,将属性和方法的调到绑定到这个对象上
属性通过__get,__set, 方法通过__call实现
其中,属性的实现是,如果有get***,set***的话,优先调用这些函数,如果没有,直接处理被包装对象的属性
出现的唯一矛盾是,由于定义了__call,对是否有get***,set***的判断总是返回true(见注释中的a和b)
所以下面的例程中,不能正确的取到价格120php 还不够熟悉,望达人指点