我有一组数据存储类。它目前有一个用于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)
。
你能给我一个提示吗?
答案 0 :(得分: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');
}
);