• PHP之func_*系列方法使用须知


    摘要:

      众所周知,PHP是一门服务器端脚本语言,也是一门弱语言,所谓弱语言就是说在你使用它的时候,它对你的变量类型不敏感,你可以在使用的时候再确定它是什么类型而非定义它的时候,同时PHP中,声明一个函数,如果你不确定他可以接收多少个参数,那么你可以在方法体中,用func_*系列函数(func_get_args/func_get_arg/func_num_args)来获取运行中的参数列表及参数信息,本文主要是记录下用func_*系列方法的时候发生的一件尴尬事件。


     

    一、故事背景

     

    在一个类中的一个方法中,我有如下方法:

     

    class test {
    public function displayTemplate() {
    Hook::template('test', func_get_arg(0));
    }
    }

           该方法在本地运行一切OK ,正常的产生预期效果。然后诡异的事情出现在将该代码上传到服务器上之后,竟然发现在Hook::template这里就搁浅了,在这个调用之前的所有调试都能正常输出,然后在Hook::template该方法里面的任何调试都没有输出。让同事来帮忙看也一头雾水

     

     

     

    二、阴错阳差的调试出现曙光

     

    某一时刻,我们在调试的时候,将以上代码改成了这样:

     

    class test {
    public function displayTemplate() {
    Hook::template('test');
    }
    }

    结果发现,竟然跑通了,然后才查了服务器版本5.2.13,而我们的本地版本都是5.3.8,于是就猜想问题出在版本上。

     

     

     

    三、恍然大悟

     

    后来查了PHP 5.3的更新记录(或是直接php.net搜索func_get_arg,看到如下一句话:

     

    5.3.0 This function can now be used in parameter lists.

     

    而同类方法下func_get_args/func_get_arg/func_num_args都有如上提示。

     

    原来可直接作为参数列表中的参数来使用,是从5.3.0开始的,所以5.3.X以下就不能这么用,于是我们将如上代码改成如下:

     

    class test{
    public function displayTemplate() {
    $arg = func_get_arg(0);
    Hook::template('test', $arg);
    }
    }

     

    四、大胆假设

    虽然没有研究过PHP的解析引擎,但是这个情况应该是和这个有关系吧,PHP5.3.0做了什么改进?


  • 相关阅读:
    Jenkins安装
    Python操作yaml文件
    class 中构造函数与析构函数
    python发送邮件(yagmail模块)
    filter、map函数的区别
    python redis操作
    多个 python的pip版本选择
    python Excel操作
    python MD5操作
    缓存淘汰算法之LRU实现
  • 原文地址:https://www.cnblogs.com/xiaoyaoxia/p/2342582.html
Copyright © 2020-2023  润新知