クラス定数を動的に指定する

このエントリーをはてなブックマークに追加
はてなブックマーク - クラス定数を動的に指定する
Share on Facebook

可変変数を使えば、動的に変数名や関数名を指定できます。 簡単な例だと、下のようなことができます。

$a = 'hello';
${$a} = ' world!';  // $hello = ' world!'; と同義になる
echo $a . $hello;   // 'hello world!' と出力される

で、これを使ってconstで指定したクラス定数を動的に読み込みたかったのですが、なかなかうまく行きませんでした。

理由は、そもそもクラス定数であって変数ではないからでしょうか。

とりあえず、constant(定数名)関数を使うことでうまくクラス定数を指定できました。

使用例

なんでこんな記事を書いたかというと、開発環境と本番環境のDBを簡単に接続しわけるクラスを作りたかったからです。 以下のクラスをrequireして、「MyConnections::get_connection(“service”)」と呼べば本番環境に接続したPDOオブジェクトを取得できます。

<?php 
/**
 * DBに接続するクラス
 */

class MyConnections
{
    /** @var 本番環境の設定 */
    const SERVICE_DSN      = "mysql:host=servicedb; port=3306; dbname=uso_db";
    const SERVICE_USERNAME = "uso";
    const SERVICE_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  接続先 (service|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;
        }
    }
}
?>

参考

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>