PHP で可変変数を使えば、動的に変数名や関数名を指定できます。簡単な例だと、下のようなことができます。
1 2 3 |
$a = 'hello'; ${$a} = ' world!'; // $hello 変数に ' world!'; が格納される echo $a . $hello; // 'hello world!' と出力される |
で、これを使って const で指定したクラス定数を動的に読み込みたかったのですが、なかなかうまく行きませんでした。
1 2 3 4 5 6 7 8 9 10 |
<?php class Uso { const PRODUCTION_VALUE = 1; const DEVELOP_VALUE = 2; } $uso = new Uso(); $environment = $argv[1]; echo $uso::${$environment}_VALUE; // Parse Error |
理由は、そもそもクラス定数であって変数ではないからでしょうか。
とりあえず、constant(定数名)関数を使うことでうまくクラス定数を指定できました。
使用例
なんでこんな記事を書いたかというと、開発環境と本番環境の DB を簡単に接続しわけるクラスを作りたかったからです。 以下のクラスをrequireして、「MyConnections::get_connection(“production”)」と呼べば本番環境に接続したPDOオブジェクトを取得できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
<?php /** * DBに接続するクラス */ class MyConnections { /** @var 本番環境の設定 */ const PRODUCTION_DSN = "mysql:host=productiondb; port=3306; dbname=uso_db"; const PRODUCTION_USERNAME = "uso"; const PRODUCTION_PASSWORD = "800"; /** @var ローカル開発環境の設定 */ const LOCAL_DSN = "mysql:host=localhost; port=3306; dbname=uso_db;"; const LOCAL_USERNAME = "root"; const LOCAL_PASSWORD = ""; /** * DBに接続し、PDOオブジェクトを返す * * @param string $target 接続先 (production|local) * @return PDO */ public static function get_connections($target) { $env = strtoupper($target); $dsn = constant("self::" . "{$env}_DSN"); $username = constant("self::" . "{$env}_USERNAME"); $password = constant("self::" . "{$env}_PASSWORD"); try { return new pdo($dsn, $username, $password); } catch (PDOException $e) { throw $e; } } } ?> |
参考
- PHP: 可変変数 – Manual
- PHP: constant – Manual
- 【 ほでなすPHP 】 PHP5の基本 -> スタティックメンバ/クラス定数
- [PHP][可変変数] 変数名や関数名を動的に指定する (masha.webTechLog)