技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> 编程语言 --> 怎样获取PHP函数默认参数常量名

怎样获取PHP函数默认参数常量名

浏览:1244次  出处信息

   如果某个函数的默认参数是个常量,那么怎么样获取这个参数的常量名称?见代码:

<?php  
function new_blog($title = DEFAULT_TITLE) {  
    // blahblah
}

   在上面的代码中,怎么样获取函数new_blog函数的参数$title所对应的默认值常量名: DEFAULT_TITLE。这个问题和以前我曾写过的一篇关于如何获取变量名称的博文相似。

   这个问题,在PHP5.4.6之前基本上没有解决方法了,因为函数定义是编译时的信息,在PHP运行时是获取不到的。当然这里说的无法实现是指的使用官方PHP版本时没法搞定。

   在PHP中类似的需求,一般都可以使用PHP的反射扩展。

PHP的反射(Reflection)

   反射是PHP5中提供的用于获取或操作PHP内部信息的标准扩展,可能写应用代码的用户使用的较少一些,编写框架或者平台性的系统会使用到。

   比如你的框架需要实现一种插件机制,而你可能需要利用反射来获取类或者函数的元信息。这里就不对Reflection的使用做过多的介绍了,详细信息见官方文档: http://cn.php.net/manual/en/book.reflection.php

新函数ReflectionParameter::getDefaultValueConstantName()

   不过在PHP5.4.6之前,Reflection是没有实现该功能的。这个需求其实来自PHPUnit的作者Sebastian Bergmann。因为这个需求在Reflection模块来说是一个缺失,不属于大功能的升级,所以直接进入了目前的最新分支PHP-5.4。同时这个功能在PHP-5.4.6中可用了。https://github.com/php/php-src/blob/PHP-5.4.6/NEWS#L41

   实现代码见:https://github.com/php/php-src/commit/13a9555342a4156a6150818234639b49a596ccd6,这个方法目前没有使用说明,不过看名字应该也能明白。不过可以参考测试用例

   这个提交给ReflectionParameter类增加了两个函数:

  • ReflectionParameter::isDefaultValueConstant() 用于判断函数的这个参数是否是常量默认参数  

  • ReflectionParameter::getDefaultValueConstantName() 用于获取这个常量默认参数的参数名称

  • <?php  
    define("CONST_TEST_1", "const1");
    
    function ReflectionParameterTest($test1=array(), $test2 = CONST_TEST_1) {  
        echo $test;
    }
    $reflect = new ReflectionFunction('ReflectionParameterTest');
    foreach($reflect->getParameters() as $param) {  
        if($param->getName() == 'test1') {
            var_dump($param->isDefaultValueConstant());
        }
        if($param->getName() == 'test2') {
            var_dump($param->isDefaultValueConstant());
        }
        if($param->isDefaultValueAvailable() && $param->isDefaultValueConstant()) {
            var_dump($param->getDefaultValueConstantName());
        }
    }
    
    class Foo2 {  
        const bar = 'Foo2::bar';
    }
    
    class Foo {  
        const bar = 'Foo::bar';
    
        public function baz($param1 = self::bar, $param2=Foo2::bar, $param3=CONST_TEST_1) {
        }
    }
    
    $method = new ReflectionMethod('Foo', 'baz');
    $params = $method->getParameters();
    
    foreach ($params as $param) {  
        if ($param->isDefaultValueConstant()) {
            var_dump($param->getDefaultValueConstantName());
        }
    }
    ?>
    // 运行结果
    bool(false)  
    bool(true)  
    string(12) "CONST_TEST_1"  
    string(9) "self::bar"  
    string(9) "Foo2::bar"  
    string(12) "CONST_TEST_1"  
    

建议继续学习:

  1. perl模块Getopt::Std用法及实例-从命令行读取参数模块    (阅读:5752)
  2. 神秘常量复出!用0x077CB531计算末尾0的个数    (阅读:5093)
  3. 将数组定义为常量    (阅读:4441)
  4. 千万不要把 bool 当成函数参数    (阅读:4041)
  5. MySQL 5.1 的参数简表    (阅读:2814)
  6. 关于在函数调用时传递string引用的必要性    (阅读:2771)
  7. MyISAM和InnoDB的一些记录    (阅读:2586)
  8. 使用参数化查询防止SQL注入漏洞    (阅读:2586)
  9. Java 常量值修改后不起作用    (阅读:2576)
  10. 给shell脚本传递变量    (阅读:2419)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1