php魔术方法__call和__callStatic

来源:互联网 发布:单片机模块化编程教程 编辑:程序博客网 时间:2024/05/16 09:06

简介

__call 当要调用的方法不存在或权限不足时,会自动调用__call 方法。
__callStatic 当调用的静态方法不存在或权限不足时,会自动调用__callStatic方法。
当调用一个不可访问的方法时 (如未定义,或者不可见)时,__call()会被调用。其中 namearguments参数时一个数组,包含着要传递给方法的参数

__call代码

<?php class Tuzi{    public function __call($name,$arguments){        switch(count($arguments)){            case 2:                echo $arguments[0]*$arguments[1],PHP_EOL;                break;            case 3:                echo array_sum($arguments),PHP_EOL;                break;            default:                echo '参数不对',PHP_EOL;                break;        }    }}$tuzi = new Tuzi;$tuzi -> make(5,6);

__callStatic代码

<?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);    }    function __get($fieldname){        return $this->fieldvalues[$fieldname];    }    static function __callStatic($method,$args){        $field = preg_replace('/^findBy(\w*)$/','${1}',$method);        echo $field."<br/>";        $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 $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'        );}class Sales extends ActiveRecord{    protected static $table = 'salesdb';    protected static $fields = array(        'id'    => 'int',        'item'  => 'varchar',        'qty'   => 'int'        );}echo Customer::findById(123) -> select;//链式操作// assert("select * from custdb where id=123" == //     Customer::findById(123) -> select);