魔術方法__call和__callStatic簡單案例

使用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();

複製代碼
相關文章
相關標籤/搜索