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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!