0

関連する投稿を検索した後、この投稿を読みました。

少し違いますが、関連する問題があります。

クラスの構造を定義できるように、EVAL()なしで(これは悪い考えです-誰かがユーザーにevalで使用される値を提供することを許可した場合などに悪用される可能性があるため)、次のような方法はありますか?

if(!class_exists($className) && dao::tableExists($className)) {
   class $className extends daoObject {
     public function __construct($uid) {
      parent::__construct($uid);
     }
   }
   dao::generateClass($className);
}

これは、新しいコアテーブルがフレームワークに追加されたときに、対応するフィールド(親の__callを介したゲッター/セッター、追加/挿入、更新/削除)にアクセスするための汎用データアクセスオブジェクトとともに使用できるためです。コーダーがクラスを作成する必要なしに、それぞれのクラスを作成し、それを検査したり、さまざまなタイプのテーブルのカスタムコードジェネレーターを作成したりする必要はありません。daoObjectは私のためにそれをすべて行います。

この種のメソッドを使用して、クラスが存在しない場合はクラスを定義し、クラス定義をファイルに書き込むことを目的としています。

対応するテーブル名が存在しない場合、失敗します。クラスが存在する場合(たとえば、次に実行されるとき)、クラスは定義されません。存在しないがテーブル名である場合は、作成して使用し、最初に呼び出すときに保存できます。これは、新しいテーブルが挿入され、スクリプトを実行してデータを挿入するときに発生します。作成者は、csvを介してテーブルフィールドとサンプルデータのみを定義します。このスクリプトは、クラスを生成し、1回のヒットでデータをインポートします。定義をファイルに書き込んでからインクルードすることもできますが、これは機能するようですが、オブジェクトのプロパティを変更した後でそれを実行したいので、ファイルを2回書き込む必要はありません。仕事。

これは単純化されていますが、可能ですか?

4

2 に答える 2

0

私はそれが可能だとは思わない; あなたが言ったように、最良のオプションはおそらくクラスをファイルに書き込んでから、その/それらのクラスを自動ロードすることです。

于 2010-09-26T22:26:56.320 に答える
0

クラス名に変数を使用することはできません (と言う場合を除きますeval())。

したがって、クラスが定義されていないテーブルの実行時に DAO オブジェクトを本当に作成する必要がある場合は、「他のテーブル」の DAO クラスを作成し、コンストラクターでテーブルの名前を渡す必要があります。

class OtherTable extends daoObject {
  public function __construct($uid, $tableName) {
   $this->table = $tableName;
   parent::__construct($uid);
  }
}

$FootballTable = new OtherTable($uid, 'football'); 
trigger_error("You need a new table class!", E_USER_WARNING);

これらのユーザー警告のいずれかがあることがログに示されている場合は、それをリマインダーとして使用して、新しいテーブルの適切なクラスを作成する必要があります。


あなたのコメントについて:

フォールバック条件であっても、実行時に新しいクラスのコードを生成することは、良い習慣ではありません。リスクは、一部の信頼できないコンテンツがクラス定義に忍び込むことです (ユーザー入力などですが、それは別のものである可能性があります)。次に、コード インジェクションのセキュリティ上の問題があります。

私が示したような一般的な任意のテーブルの DAO クラスが必要な場合、またはデータベースに新しいテーブルを作成するときに、開発中に新しい DAO クラスを作成するのが最善の解決策です。それがあなたの解決策ではないのはなぜですか?

于 2010-09-26T22:33:59.487 に答える