2012-03-15 14 views
7

PHPで匿名クラスを作成するためのアイデアが必要です。私はどのように働くことができるのか分かりません。匿名クラスの構築

私の限界を参照してください:

  • PHPであなたは(class {}のような)匿名関数のように、匿名クラスを作ることはできません。
  • PHPでは、クラススコープはありません(名前空間は例外ですが、以下同じ問題があります)。
  • PHPでは、変数を使用してクラス名を指定することはできません(class $name {}など)。
  • 私はrunkit PECLをインストールするためのアクセス権がありません。
私は必要なもの

、そしてなぜ

まあ、私は、キーの名前と匿名クラスを受信すなわちcreate_class()という関数を作成する必要があります。 PHPが受け入れることのできない別の名前クラスシンボルを使用したいので、私にとっては便利です。たとえば、

<?php 

    create_class('it.is.an.example', function() { 
    return class { ... } 
    }); 

    $obj = create_object('it.is.an.example'); 

?> 

だから、私はこの使用を受け入れる考えが必要です。私のフレームワークでは、私はこのパスを持っているので、それが必要です:/modules/site/_login/models/path/to/model.php。したがって、model.phpsite.login/path.to.modelという新しいクラスを宣言する必要があります。コールcreate_object()

内部キャッシュが(のようなit.is.an.exampleそれは単に新しいクラスのオブジェクトを返す。、負荷を必要としない場合。だから私は、クラスファイルはしっかりと何検索する$classコンテンツを使用します。

$class定義を持っている場合
+1

PHPの匿名クラスの欠如は非常に制限的です。 – MirroredFate

+2

この質問を調べることができます:http://stackoverflow.com/q/6384431/3933332 – Rizier123

+0

なぜ無効なクラス名を使用する必要がありますか?なぜあなたはこれらのものを単に代用することはできないのですか?」と言いましょう。 –

答えて

4

PHP 7.0では、anonymous classesとなります。私は完全にあなたの質問を理解していないが、あなたのcreate_class()関数は次のようになります。これは、匿名クラス型とオブジェクトをインスタンス化し、$repositoryにそれを登録します

function create_class(string $key, array &$repository) { 
    $obj = new class($key) { 
     private $key; 
     function __construct($key) { 
      $this->key = $key; 
     } 
    }; 
    $repository[$key] = $obj; 
    return $obj; 
} 

。オブジェクトを取得するには、作成したキーを$repository['it.is.an.example']で使用します。

6

あなたがそう基本的には工場出荷時のパターンを実装するはstdClass

$the_obj = new stdClass(); 
+4

'stdClass'にメソッドをアタッチできません – webbiedave

6

を使用してダミーのクラスを作成することができます。

Class Factory() { 
    static $cache = array(); 

    public static getClass($class, Array $params = null) { 
    // Need to include the inc or php file in order to create the class 
    if (array_key_exists($class, self::$cache) { 
     throw new Exception("Class already exists"); 
    } 

    self::$cache[$class] = $class; 
    return new $class($params); 
    } 
} 

public youClass1() { 
    public __construct(Array $params = null) { 
    ... 
    } 
} 
0あなたが本当にそれをする必要がある場合は、あなたが eval()

$code = "class {$className} { ... }"; 
eval($code); 
$obj = new $className(); 

を使用することができます。しかし神々が​​これを承認しないだろう

は重複

+1

正確ではありません。重複を避けるために、匿名クラスを作成するメソッドが必要です。私が 'foo'を2回宣言すれば、失敗します。 –

0

をチェックするために内部キャッシュを追加します。あなたがそれをするなら、あなたは地獄に行くでしょう。