2013-03-29 34 views
3

我有一組用於數據存儲的類。它目前有一個適用於Google Drive,Dropbox,Box,FTP和本地連接的工作連接器。我設計了這個來構建一個文件管理器,客戶端可以管理多個數據存儲源。PHP - 爲給定名稱空間獲取已定義的常量

這是我的問題。目前,我實現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)

你能給我一個提示嗎?

回答

2

你可以得到所有用戶定義的常量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'); 
    } 
); 
+0

哇。我真的很感動。我將不得不添加幾行代碼來刪除'service \ storage \'字符串,但這樣做有訣竅。非常感謝! :) –