使用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();
複製代碼