济南PHP培训
济南市达内教育培训学校

17156168575

热门课程

济南php培训:__call和__callStatic方法

  • 时间:2016-08-08
  • 发布:济南php培训
  • 来源:济南php培训

如何防止调用不存在的方法而出错,使用__call魔术重载方法.济南php培训机构来教你如何使用__call和__callStatic重载:

__call方法原型如下:

mixed __call(string $name,array $arguments)

当调用一个不可访问的方法(如未定义,或者不可见时), __call()就会被调用.其中$name参数是要调用的方法名称.$arguments参数是一个数组,包含者要传递给方法的参数,

如下所示:

class HandsonBoy{

private $name = 'chenqionghe';

private $age = 18;

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;

}

}

}

$a = new HandsonBoy();

$a->make(5);

$a->make(5,6);

以上代码模拟了类似其他语言中的根据参数类型进行重载.跟__call配套的魔方方法是__callStatic.

当然,使用魔术方法"防止调用不存在的方法面报错",并不是魔术方法的本质.实际上,魔术方法使用方法的动态创建变为可能.这在MVC等框架设计中是很有用的语法.假设一个控制器调用了不存在的方法,那么只要定义了__call魔术方法,就能很友好地处理这种情况.

以下代码通过使用_callStatic这一魔术方法进行方法的动态创建和延迟绑定,实现一个简单的ORM模型

abstract class ActiveRecord

{

protected static $table;

protected $fieldvalue;

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);

$query = "SELECT * FROM " . static::$table . " WHERE $field='$args[0]'";

return self::createDomain($query);

}

private static function createDomain($query)

{

$class = get_called_class();//获取静态方法调用的类名

$domain = new $class();

$domain->fieldvalues = array();

$domain->select = $query;

foreach ($class::$fields as $field => $type)

{

$domain->fieldvalues[$field] = 'TODO:set from sql result by ' . $field;

}

return $domain;

}

}

class Customer extends ActiveRecord

{

protected static $table = 'custdb';

protected static $fields = array(

'id' => 'int',

'email' => 'int',

'lastname' => 'varchar'

);

}

class Sales extends ActiveRecord

{

protected static $table = 'salesdb';

protected static $fields = array(

'id' => 'int',

'item' => 'varchar',

'qty' => 'int'

);

}

var_dump(Customer::findById(123)->select);

var_dump(Customer::findById(123)->email);

var_dump(Sales::findByLastname('Denoncourt')->select);

文章来源:济南php培训

上一篇:第十届达内英才添翼校企合作高峰论坛在成都召开
下一篇:济南php培训:PHPUNIT初探

马上预约七天免费体验课

姓名:

电话:

php安全编程——python测试实例编写

PHP 处理表单数据实例操作

PHP翻页类 调用实例

“#smoosh门”引发Web兼容性上的挑战

选择城市和中心
贵州省

广西省

海南省

达内教育

有位老师想和您聊一聊