PHP 魔术方法 __call 与 __callStatic 方法

PHP 5.3 后新增了 __call 与 __callStatic 魔法方法。

  • __call 当要调用的方法不存在或权限不足时,会自动调用__call 方法。
  • __callStatic 当调用的静态方法不存在或权限不足时,会自动调用__callStatic方法。
class Animal
{
private function eat()
{
echo 'eat';
} public function __call($name, $arguments)
{
echo '调用不存在的方法名是:' . $name . '<br>参数是:';
print_r($arguments);
echo '<br>';
} public static function __callStatic($name, $arguments)
{
echo '调用不存在的--静态--方法名是:' . $name . '<br>参数是:';
print_r($arguments);
}
} $animal = new Animal();
$animal->drink([1, 2, 3]);
// 调用不存在的方法名是:drink
// 参数是:Array ( [0] => Array ( [0] => 1 [1] => 2 [2] => 3 ) ) Animal::smile(['可爱', '大笑', '微笑']);
// 调用不存在的--静态--方法名是:smile
// 参数是:Array ( [0] => Array ( [0] => 可爱 [1] => 大笑 [2] => 微笑 ) )

这里说一下我看到的 __callStatic 应用场景

扩展类中的方法 在tp5框架 Log.php 中

 /**
* 静态调用
* @param $method
* @param $args
* @return mixed
*/
public static function __callStatic($method, $args)
{
// 类变量$type = ['log', 'error', 'info', 'sql', 'notice', 'alert', 'debug'];
if (in_array($method, self::$type)) {
array_push($args, $method);
return call_user_func_array('\\think\\Log::record', $args);
}
}

这样就可以扩展出 Log::log()、Log::error()...等7个方法

还有一种用法,可以看 tp5 框架 Db.php 文件最下面,** 可以调用其他类的方法 **

   // 调用驱动类的方法
public static function __callStatic($method, $params)
{
// 自动初始化数据库
return call_user_func_array([self::connect(), $method], $params);
}

今天看到监听 sql 代码的时候,发现 \think\Db 下面没有 listen 方法,当我们调用\think\Db::listen 的时候,实际调用的是 Connection 类中的 listen 方法

上述代码 self::connect() 返回的是一个连接对象,$method 是这个对象中的方法,构成 call_user_func_array([对象,方法],参数)

顺便附上 call_user_func_array 这个函数的使用文档

菜鸟一枚,如有不对,敬请指出

PHP 魔术方法 __call 与 __callStatic 方法的更多相关文章

  1. PHP魔术方法之__call与__callStatic方法

    <?php class human{ private function t(){ } //魔术方法__call /* $method 获得方法名 $arg 获得方法的参数集合 */ public ...

  2. 魔术方法之__call与__callStatic方法

    <?php class human{ private function t(){ } /** * 魔术方法__call * * @param string $method 获得方法名 * @pa ...

  3. PHP中的__call和__callStatic方法

    如何防止调用不存在的方法而出错,使用__call魔术重载方法. __call方法原型如下: mixed __call(string $name,array $arguments) 当调用一个不可访问的 ...

  4. PHP中的__call和__callStatic方法(未看完)

    如何防止调用不存在的方法而出错,使用__call魔术重载方法. __call方法原型如下: mixed __call(string $name,array $arguments) 当调用一个不可访问的 ...

  5. __call()和__callStatic()方法

    __call() 当对象访问不存在的方法时,__call()方法会被自动调用__callStatic() 当对象访问不存在的静态方法时,__callStatic()方法会被自动调用 这两个方法在PHP ...

  6. php中__call() 和 __callStatic方法的使用

    __call 与__callStatic 魔法方法是php5.3后新增的,二者的应用场景: 1.当要调用的方法不存在或权限不足时,会自动调用__call 方法. 2.当调用的静态方法不存在或权限不足时 ...

  7. php -- 魔术方法 之 调用方法:__call()、__callStatic()

    方法重载:当调用一个不存在或者权限不够的方法的时候,会自动调用__call()方法 public function __call($name,$args){}  :用对象调用方法 public sta ...

  8. 巧妙的重载魔术方法__call()

    工作半年了,感觉这半年学到的东西比大学四年学到的还要多,主要原因是心静下来了,目标也明确了,不会去整天的和游戏纠缠在一起了.大学时候其实也意识到了玩游戏会影响自己的正常学习和工作的,但是一直控制不了自 ...

  9. php用魔术方法__call实现类函数重载

    因为php是弱类型语言,不喜欢c++通过改变函数返回相同的值键入的参数的数目和功能将过载!但在需求函数的实际发展可能过载.开发需求,我们能够通过魔术方法__call()来实现函数重载. class T ...

随机推荐

  1. Windows 黑屏问题

    这两天使用Microsoft Visual Studio编译项目,不断黑屏闪现!回想下应该是之前设置的DOS窗口全屏的原因. 记得又一次使用MSDOS,老感觉屏幕台下,于是就设置成了全屏显示,全屏后发 ...

  2. 从覆盖bootstrap样式谈css选择器优先级

    样式优先级 首先简单说几个定义样式的方式: 元素内嵌: <li><a href="" style="color:#ffffff;">SH ...

  3. StringBuffer与StringBuilder的区别,及实现原理

    区别 1.StringBuffer 与 StringBuilder 中的方法和功能完全是等价的, 2.只是StringBuffer 中的方法大都采用了 synchronized 关键字进行修饰,因此是 ...

  4. 2761: [JLOI2011]不重复数字(哈希表)

    2761: [JLOI2011]不重复数字 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1770  Solved: 675[Submit][Stat ...

  5. iOS截屏保存至相册

    #pragma mark 截屏并保存至相册 -(void)screenShotsComplete:(void(^)(UIImage * img)) complete { CGSize imageSiz ...

  6. 【Javascript】搞定JS面试——跨域问题

    什么是跨域? 为什么不能跨域? 跨域的解决方案都有哪些(解决方法/适用场景/get还是post)?  一.什么是跨域?       只要协议.域名.端口有任何一个不同,就是跨域.           ...

  7. git 由http切换成git

    项目中经常会遇到http 的git 协议为了安全切换成ssh 的git 协议. 这个时候,只要使用如下命令变更 remote 字符串就好了. git remote set-url origin git ...

  8. springmvc基础学习3---注解简单理解

    1:@Controller 用来注解这个bean是MVC模型中的一个C 会被spring的auto-scan扫到纳入管理.Spring mvc框架中的action层注入,也就是控制层.控制器Contr ...

  9. windows phone 8.1 FlipView 实现照片自动浏览

    FlipView 控件也是一个集合控件,不过它和ListView等控件不同,ListView控件是一次显示多个项,而FlipView则是每次只显示一个项.在windows phone上通过默认的左右滑 ...

  10. flex与后台及页面间对象的传递

    1.从flex中发送请求后,利用<s:RemoteObject/>启用回调方法,类似于jQuery的post函数: <fx:Declarations>        <s ...