【问题标题】:PHP - get defined constants for a given namespacePHP - 获取给定命名空间的定义常量
【发布时间】:2013-03-20 16:41:44
【问题描述】:

我有一组用于数据存储的类。它目前有一个用于 Google Drive、Dropbox、Box、FTP 和本地连接的工作连接器。我设计它是为了构建一个文件管理器,客户端可以在其中管理多个数据存储源。

我的问题来了。目前,我对addConnection() 方法的实现如下:

// addConnection - adds a storage connection to the storage manager
public function addConnection($service, $credentials) {
    if (!empty($service) && !empty($credentials)) {
        if (in_array($service, [Connectors\Box, Connectors\Dropbox, Connectors\FTP, Connectors\GoogleDrive, Connectors\Local], true)) {
            // rest goes here...
        }
    }
}

我的常量在一个单独的命名空间中,如下所示:

namespace Services\Storage\Connectors {
    const Box = "Box";
    const Dropbox = "Dropbox";
    const FTP = "FTP";
    const GoogleDrive = "GoogleDrive";
    const Local = "Local";
}

有没有办法让我为给定的命名空间获取所有定义的常量?这样,我可以构造一个函数来获取所有已定义的常量并编写更优雅的东西,例如in_array($service, getConstants($this->getNamespace()), true)

你能给我一个提示吗?

【问题讨论】:

    标签: php namespaces constants


    【解决方案1】:

    您可以使用get_defined_constants 获取所有用户定义的常量,然后使用strpos 检查命名空间:

    $constants = get_defined_constants(TRUE)['user'];
    
    foreach ($constants as $name => $value)
    {
    
      if (0 === strpos($name, 'services\storage\connectors'))
      {
        $services_storage_connectors[] = $name;
      }
    
    }
    
    echo '<pre>' . print_r($services_storage_connectors, TRUE) . '</pre>';
    
    /*
    
    Array
    (
        [0] => services\storage\connectors\Box
        [1] => services\storage\connectors\Dropbox
        [2] => services\storage\connectors\FTP
        [3] => services\storage\connectors\GoogleDrive
        [4] => services\storage\connectors\Local
    )
    
    */
    

    注意$name 是小写的,即使命名空间是用大写字母定义的。

    编辑:如果你想用更少的行数

      $constants = array_filter(array_keys(get_defined_constants(TRUE)['user']), function ($name)
      {
        return 0 === strpos($name, 'services\storage\connectors');
      }
      );
    

    【讨论】:

    • 哇。我真的很感动。我将不得不添加几行代码来删除 `service\storage` 字符串,但这成功了。非常感谢! :)
    猜你喜欢
    • 2013-06-12
    • 2013-06-03
    • 2011-12-18
    • 1970-01-01
    • 2023-01-25
    • 2013-09-17
    • 2014-09-02
    • 1970-01-01
    • 2015-06-02
    相关资源
    最近更新 更多