IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

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

Zen Space 2015-01-11 23:55:23 累计浏览 2,407 次
本机暂存

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

<?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. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. 使用gettext来支持PHP的多语言 (累计阅读 39,270)
  2. WordPress插件开发 -- 在插件使用数据库存储数据 (累计阅读 29,164)
  3. Paypal接口详细代码(PHP版,非API接口) (累计阅读 19,408)
  4. 我的PHP,Python和Ruby之路 (累计阅读 13,150)
  5. include(“./file.php”)和include(“file.php”)区别 (累计阅读 12,790)
  6. 15个最好的免费开源电子商务平台 (累计阅读 12,541)
  7. Redis消息队列的若干实现方式 (累计阅读 12,088)
  8. 到底什么是MVC? (累计阅读 11,869)
  9. 整理了一份招PHP高级工程师的面试题 (累计阅读 11,709)
  10. Rolling cURL: PHP并发最佳实践 (累计阅读 11,488)