PHP 魔法方法之__call和__callStatic
来源:互联网 发布:vb程序代码 编辑:程序博客网 时间:2024/06/10 08:58
__call和__callStatic方法
__call和__callStatic方法都可用于防止调用不存在的方法而出现报错,但也能用于方法的动态创建,这在MVC等框架设计中是很有用的语法。
__call方法原型如下:
mixed __call( string $name , array $arguments )
当调用一个不可访问的方法(如未定义,或者不可见)时,__call()
会被调用。其中$name
参数是要调用的方法名称。$arguments
参数是一个数组,包括着要传递给方法的参数。如下所示:
public function __call($name,$arguments){ switch(count($arguments)){ case 2: echo $arguments[0]*$arguments[1],PHP_EOL; break; case 3: echo array_sum($arguments),PHP_EOL; break; default: echo '参数不对',PHP_EOL; break; }}$a->make(5);$a->make(5,6);
__callStatic方法用法和 __call一样,但它用于静态方法中。下面这段代码通过使用__callStatic 进行方法的动态创建和延迟绑定,实现一个简单的ORM模型。
<?phpabstract class ActiveRecord{ protected static $table; protected $fieldvalues; public $select; static function findById($id){ $query = "select * from " .static::$table ." where id=$id"; return self::createDomain($query); } function __get($fieldname){ return $this->fieldvalues[$fieldname]; } static function __callStatic($method, $args){ $field = preg_replace('/^findBy(\w*)$/','${1}',$method); $query = "select * from " .static::$table ." where $field='$args[0]'"; return self::createDomain($query); } private static function createDomain($query){ $klass = get_called_class(); $domain = new $klass(); $domain ->fieldvalues = array(); $domain ->select = $query; foreach($klass::$fields as $field => $type){ $domain ->fieldvalues[$field] = 'TODO: set from sql result'; } return $domain; }}class Customer extends ActiveRecord{ protected static $table = 'custdb'; protected static $fields = array( 'id' => 'int', 'email' => 'varchar', 'lastname' => 'varchar' );}class Sales extends ActiveRecord{ protected static $table = 'salesdb'; protected static $fields = array( 'id' => 'int', 'item' => 'varchar', 'qty' => 'int' );}assert("select * from custdb where id=123" == Customer::findById(123) ->select);assert("TODO: set from sql result" == Customer::findById(123) ->email);assert("select * from salesdb where id=321" == Sales::findById(321) ->select);assert("select * from custdb where Lastname='Denoncourt'" == Customer::findByLastname('Denoncourt') ->select);
参考资料:
《PHP核心技术与最佳实践》
0 0
- PHP 魔法方法之__call和__callStatic
- php __call() 和 __callStatic()
- php __call 和 __callStatic
- PHP 魔术方法之 __call 与 __callStatic
- php魔术方法__call和__callStatic
- php之__call()和 __callStatic()
- __call和__callStatic方法
- 魔术方法__call 和__callStatic
- PHP魔术方法之__call与__callStatic方法
- PHP魔术方法之__call与__callStatic方法
- PHP魔术方法之__call与__callStatic方法
- PHP魔术方法之__call与__callStatic方法
- PHP魔术方法之__call与__callStatic方法
- PHP魔术方法之__call与__callStatic方法
- php面向对象基本概念(魔法方法)__invoke() __toString() __call() __callStatic() __clone()
- php的__call 与__callStatic 方法
- php __call 与 __callStatic
- php __call 与 __callStatic
- Linux字符编码默认为UTF-8,如出现乱码可设置为GBK 1.手动更改profile文件的命令: vi /etc/profile 也可以修改 /etc/sysconfig/i18n 文件,如
- springmvc
- 12.Selenium2 自动化测试实战-基于Python语言-定位一组元素
- Matrix Decompressing
- 【MPEG】DVB / ATSC / ISDB区别
- PHP 魔法方法之__call和__callStatic
- SpringMVC返回json数据
- 测试
- Android解决三星手机图片旋转问题
- Android 开发绕不过的坑:你的 Bitmap 究竟占多大内存?
- 点读笔写字App——背景交代
- 点读笔写字App(1)——从Drawable中获取图片画图
- PCIe学习笔记(16)--- Power Management (1)
- 点读笔写字App(2)——初始化本子上已经记录的文字