simpleOrm.php
使用php魔术方法__callStatic实现一个简单的ORM模型
<?php
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);
}
public 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 $filed => $type) {
$domain->fieldvalues[$filed] = 'TOTD: 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' => 'varchar'
);
}
echo Customer::findById(123)->email;
echo "<br>";
echo Customer::findById(123)->select;
echo "<br>";
echo Sales::findById(123)->select;
echo "<br>";
echo Customer::findByLastname('Denoncourt')->select;
使用魔术方法__call()实现一个简单的链式操作
class NewString
{
public $value;
public function __construct($value)
{
$this->value = $value;
}
public function __call($name, $arguments)
{
array_unshift($arguments, $this->value);
$this->value = call_user_func_array($name, $arguments);
return $this;
}
}
$newString = new NewString(111111);
$newString->trim()->strlen();
本作品采用《CC 协议》,转载必须注明作者和本文链接