PHP|ThinPHP5杂技

ThinkPHP5.1

thinkphp\library\think\route\dispatch\Module.php P108 用到 is_callable()方法

        if (is_callable([$instance, $action])) {
            // 执行操作方法
            $call = [$instance, $action];
            // 自动获取请求变量
            $vars = $this->app->config(‘app.url_param_type‘)
            ? $this->app[‘request‘]->route()
            : $this->app[‘request‘]->param();
        } elseif (is_callable([$instance, ‘_empty‘])) {
            // 空操作
            $call = [$instance, ‘_empty‘];
            $vars = [$actionName];
        } else {
            // 操作不存在
            throw new HttpException(404, ‘method not exists:‘ . get_class($instance) . ‘->‘ . $action . ‘()‘);
        }

        $this->app[‘hook‘]->listen(‘action_begin‘, $call);

        return Container::getInstance()->invokeMethod($call, $vars);
    }

但是当 $instance中有 __call 方法时,is_callable([$instance, $action]) 返回的总为true,需要注意,貌似Thinkphp5中反射导致的__call方法无效(个人临时理解)

colin 03-Oct-2010 08:30  //代码块来自PHP手册

 I haven‘t seen anyone note this before, but is_callable will correctly determine the existence of methods made with __call. The method_exists function will not.

 Example:
<?php

class Test {

     public function testing($not = false) {
         $not = $not ? ‘true‘ : ‘false‘;
         echo "testing - not: $not<br/>";
     }

     public function __call($name, $args) {
         if(preg_match(‘/^not([A-Z]\w+)$/‘, $name, $matches)) {
             $fn_name = strtolower($matches[1]);
             if(method_exists($this, $fn_name)) {
                 $args[] = true; // add NOT boolean to args
                 return call_user_func_array(array($this, $matches[1]), $args);
             }
         }
         die("No method with name: $name<br/>");
     }

 }

$t = new Test();
$t->testing();
$t->notTesting();

 echo "exists: ".method_exists($t, ‘notTesting‘).‘<br/>‘;
 echo "callable: ".is_callable(array($t, ‘notTesting‘));

?>

 Output:

 testing - not: false
 testing - not: true
 exists:
 callable: 1 
时间: 2024-10-05 11:58:51

PHP|ThinPHP5杂技的相关文章

杂技之sharpdevelop调试aps.net

背景: 本人笔记本电脑不给力,vs打开实在太慢,因此考虑使用sharpdevelop,但sharpdevelop有点麻烦事,就是不支持asp.net的调试,为解决此问题,本人在此杂技一把了 方案一: 使用vs2010自带的WebDev.WebServer40.EX 在IDE(sharpdevelop)的web项目中右键选择“属性”->“调试” 在“启动外部程序”中写“C:\Program Files\Common Files\Microsoft Shared\DevServer\10.0\Web

P1842 奶牛玩杂技

P1842 奶牛玩杂技 这道题目知道结论是比较好写的,关键是结论是怎样推出来的. 我们先只考虑相邻的两个奶牛,设这两个奶牛为 \(a\) 和 \(b\) ,这两个奶牛上面的奶牛总重量为 \(W\) ,所以我们考虑 \(a\) 在上面的情况和 \(b\) 在上面的情况. \(a\) 在上面的情况: \(a\) 的压扁指数为 \(W-S_a\) , \(b\) 的压扁指数为 \(W+W_a-S_b\) . \(b\) 在上面的情况: \(b\) 的压扁指数为 \(W-S_b\) , \(a\) 的压

从SS到LNG 杂技上单圣枪哥花活不断 让一追二带领队伍再取一胜

对于LPL的老观众来说,都一定还会记得蛇队Snake.虽然它没有IG.RNG.FPX这些强队的傲人成绩,但他敢打敢拼能用各种花活斩强队于马下的风格,总会让观众眼前一新.热血沸腾.而在被收购更名为LNG之后,虽然这个赛季没有了水晶哥和sofm,但从表现来说他们依然还是那支让人惊喜的战队. 在今天的比赛中,杂技上单Flandre圣枪哥,在第一局失利后,第二局选出上单奇亚娜完美节奏带动队伍扳回一城.第三局再祭出上单石头人,势不可挡无解开团,慢慢运营粉碎了BLG取胜的希望. 奇怪的上单瞬秒对方AD 同时

JS杂技之无中间变量的值交换方式

从http://www.cnblogs.com/liuyitian/p/4081517.html#3074553看到一种无中间变量的值交换方式,具体如下: var a = 1;var b = 2;a = [b, b=a][0]alert(a+'_'+b) // 结果 2_1,a和b的值已经互换 端详代码,技巧是用一个匿名数组来储存和交换值,这种方式暗里需要新建数组的,它相对于新建变量我感觉时间空间上都没优势,可读性还差些.只是写法稍简短花哨一些.

杂技-未知知识区

记录一下比较少见的知识 1:关于c++字符串拼接 这样通过g++编译,能够通过,且能够打印正常,输出:aaabbb

关于数据库优化杂技

作为记录,一些最基本的检查: 1.数据库日志文件是否很慢,会拖慢系统速度:如何收缩日志需要注意: 2.tempDb数据库是否很大,会拖慢系统速度:数据库每次重启,会重建tempdb,给tempdb分配一个初始值较大的空间,如数据文件300m,日志文件50m: 3.通过管理工具,性能查看器,根据磁盘io,两个重要指标:PhysicalDisk中的Avg.Disk Read Queue Length 和 Avg.Disk Write Queue Length,如果这两个平均值大于0.5,就需要注意磁

Linux基础杂技

挂载光盘 mkdir /mnt/cdrom #建立挂载点 mount /dev/cdrom /mnt/cdrom/ #挂载光盘 更换YUM源: cd /etc/yum.repos.d/ 使网络yum源失效 mv CentOS-Base.repo CentOS-Base.repo.bak 更换光盘为yum源 vi CentOS-Media.repo # yum list 查看是否修改成功(第三列是源名字) 更换163源 参考网站http://mirrors.163.com/.help/centos

Python杂技

py转exe文件 用 pyinstaller,可以把所有文件打包成一个单独的exe文件 win10X64 =>pip install pyinstaller pyinstaller [参数] [脚本路径] ,该参数包括: -F , -onefile: 指明该选项,将会生成一个总的exe文件,所有的文件都会被添加到这一个中. -D, -onedir: 产生一个目录来盛装用于分发的exe文件,也比较方便. -K, -tk: 在部署的时候,包含TCL/TK,这对于有图形界面的python文件比较的适用

关于html的一些杂技

html预定义字符指的是 :<   > html实体指的是 $amp 等 php中htmlspeciachar()就是讲html预定义字符转换成html实体. 浏览器渲染时,会将html实体转换成html预定义字符显示出来,但是查看html源码是显示的还是html实体. 而如果查看源码时(ctrl+u),中<>的内容不会再网页中显示出来,而显示的时html实体,会在页面中显示html预定义字符