您的位置:首页 > 编程语言 > PHP开发

php 通过__callStatic魔术方法实现方法的动态创建和延迟绑定

2014-03-23 13:29 941 查看
<?php
/*
*面向对象魔术方法__callstatic方法的使用
*static 延迟绑定
*/
assert_options(ASSERT_ACTIVE,   1);//允许使用assert()函数
abstract 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();
$Customer = new Customer();

$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'
);
public function getval(){
return self::$fields;
}
}
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 面向对象