2

私はかなり長い間アクティブレコードを使用していて、少し風景を変えたいと思っていました。開発者の友人の何人かはORMを調べることを提案しました。私が見たすべてのORMプロジェクトには、ORMクラスを拡張する別のクラスが必要です。

私の質問は、関数内からPHPを 使用して動的にクラスを作成する方法はありますevalか?

これは私が持っているものです:

<?php
    class Constructor
    {
            function new_class($class)
            {
                    $myself = get_called_class();
                    eval("class {$class} extends {$myself} { }");
            }
            function say_hi()
            {
                    $class = get_called_class();
                    echo "Hi, {$class}!";
            }
    }

    $constructor = new Constructor;
    $constructor->new_class("Greeter");

    $greeter = new Greeter;

    $greeter->say_hi(); // Hi, Greeter!

しかし、私のクライアントは、eval彼が共有ホスティングを使用しているために、彼の環境でブロックされていることを通知します。

4

1 に答える 1

2

あなたはおそらくそれをしたくないでしょう。ただし、回避策として、viaと同じアプローチを使用できますがeval()、evalにフィードする文字列を作成したら、それをファイルとして書き出して、再度インクルードします。

このようなもの:

function my_eval($str)
{
  $filename = uniqid().'.tmp';
  file_put_contents ($filename, $str);
  include $filename;
  unlink ($filename);
}

私はこれをメモリから作成し、テストしていませんが、うまくいくはずだと思います。私が今見ている唯一の注意点は、基本的にはと同じことをしているということです。eval()このバリアントでは、呼び出し元のコンテキストと同じスコープで変数を作成できません(ただし、$GLOBALS[]を使用してグローバルスコープ変数についてはそれを回避してください)。

于 2013-03-16T13:48:18.587 に答える