3

データストレージ用のクラスのセットがあります。現在、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)ます。

ヒントを教えてください。

4

1 に答える 1

3

すべてのユーザー定義定数を取得し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');
  }
  );
于 2013-03-29T22:45:28.417 に答える