クラス定数を動的に指定する
PHP で可変変数を使えば、動的に変数名や関数名を指定できます。簡単な例だと、下のようなことができます。
$a = 'hello';
${$a} = ' world!'; // $hello 変数に ' world!'; が格納される
echo $a . $hello; // 'hello world!' と出力される
で、これを使って const で指定したクラス定数を動的に読み込みたかったのですが、なかなかうまく行きませんでした。
<?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オブジェクトを取得できます。
<?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](http://jp.php.net/manual/ja/language.variables.variable.php)
- [PHP: constant - Manual](http://php.net/manual/ja/function.constant.php)
- [ スタティックメンバ/クラス定数']);" title="【 ほでなすPHP 】 PHP5の基本 -> スタティックメンバ/クラス定数">【 ほでなすPHP 】 PHP5の基本 -> スタティックメンバ/クラス定数](http://www.shigeweb.jp/php/project_p/?page=static§ion=php5oop)
- [[PHP][可変変数] 変数名や関数名を動的に指定する (masha.webTechLog)](http://masha.maakikaku.jp/2008/03/php.php)