0

基本的な CRUD 機能と検証などを提供する抽象的な「オブジェクト」クラスがあります。通常、__autoload($name) マジック関数を使用して、クラスと同じ名前の独自のファイルに存在するクラスをロードします。遅延ロードしたい。コードは次のようになりますが、ご想像のとおり、かなり繰り返しになります。

final class bicycle extends object {
    public function __construct($id=null) {
      parent::__construct($id, __CLASS__);
    }
    public function __toString() {
      return($this->name);
    }
}

私の質問は、これらのクラスをオンザフライで動的に生成できるかどうかです。そのため、同じ機能を何度も作成する必要がなくなり、オーバーヘッドと設計時間が短縮されます。PHP5 はこれをサポートしていますか、それとも単に OO PHP の能力を過大評価しているのでしょうか?

ありがとう!

4

3 に答える 3

6

これをコピーして貼り付ける代わりに、クラスの定義にメソッド__constructとメソッドのコードを入れてみませんか?__toStringobject

このようなことをする必要があります:

class object {
    public function __construct($id = null) {
        $this->name = get_class($this);
    }
    public function __toString() {
      return($this->name);
    }
    protected $name;
}

final class bicycle extends object {

}

そして、それを呼んで:

$a = new bicycle();
var_dump($a);

あなたが得る:

object(bicycle)[1]
  protected 'name' => string 'bicycle' (length=7)

bicycleこれは、適切な値の名前を持つクラスのインスタンスを意味しますproperty

bicycleクラス自体の定義を除いて、コードをコピーして貼り付ける必要はありません。


補足として、本当にクラスを動的に生成したい場合は、おそらく次のようなものを使用できます。

$code = 'final class bicycle extends object {}';
eval($code);

$code変数を動的に作成する必要があります。

しかし、私はこれに反対することを強くお勧めします

  • IDEはクラスを表示できないため、IDEでコードアシストを使用することはできません。
  • クラスにphpdocがありません(同じ理由)
  • 常に「評価は悪」のものがあります-そしてそれは少なくともこの状況では非常に真実です。
  • new bicycleクラスを宣言せずに「」を使用すると、気分が悪くなります。
  • の使用には、パフォーマンスへの影響があります。eval

新しいクラスを宣言することはそれほど苦痛ではありません、そして私は間違いなくこのようなものを使うよりも数行をコピー-貼り付け-変更することを好みます。

于 2009-09-22T03:50:56.650 に答える
0

この機能はPHP5には存在しません。PHP6で利用できるかもしれませんが、ubuntuのパッケージがまだないため、先に進みません。

于 2009-09-22T13:47:18.913 に答える
0

__toStringの場合は、親クラスに配置するだけです。例は次のとおりです。

class BaseObject {
    public function __toString() {
        return $this->name;
    }
}

class bicycle extends BaseObject {
}

$b = new bicycle();
$b->name = 'foo';
echo $b;

コンストラクターをオーバーライドしてCLASSに渡すことで何を達成しようとしているのか正確にはわかりません。

于 2009-09-22T03:26:18.010 に答える