1

次のコードを検討してください。

class Vehicle {

    /**
    * Create a new instance of Vehicle
    * 
    * @return Vehicle
    */
    public static function create(){

        return eval( "return new " . get_called_class() . '();' );
        // return self(); would always return Vehicle reg ardless

    }


    public function drive(){

        echo "I am a Vehicle!";

    }

}

class Bus extends Vehicle {

    public function drive(){

        parent::drive();

        echo "\nSpecifically, a bus!";

    }

}


class Car extends Vehicle {

    public function drive(){

        parent::drive();

        echo "\nSpecifically, a car!";

    }

}

// Drive a car
    Car::create()->drive();

// Drive a bus
    Bus::create()->drive();

使用したいクラスのインスタンスを取得できるようにするファクトリー「作成」メソッドを Vehicle クラスに実装しました。

「return new self();」を使ってみた しかし、それは常に Vehicle のインスタンスを返すため、eval を使用することにしました。

質問: 次のように create() メソッドを実装する非評価方法はありますか?

  • 使用しているクラスのインスタンスを返します
  • 拡張クラスのそれぞれに create() を実装する必要はありません
4

3 に答える 3

4

の代わりに静的を使用しますself。例:

<?php
class Vehicle {
    public static function create(){
        return new static();
    }

    public function drive(){
        echo "I am a Vehicle!";
    }
}

class Bus extends Vehicle {
    public function drive(){
        parent::drive();
        echo "\nSpecifically, a bus!";

    }
}

$b = Bus::create();
$b->drive();

プリント

I am a Vehicle!
Specifically, a bus!
于 2012-10-19T21:21:06.573 に答える
1

(VolkerK は私を打ち負かしましたが、これにはわずかな違いがあります)

待って、なぜあなたeval()はまったく必要なのですか?しません:

public static function create() {
    $class = get_called_class();

    return new $class();
}

仕事?

于 2012-10-19T21:22:58.627 に答える
0

最善の方法は、ファクトリ メソッドを具象型から独自のファクトリ クラスに移動することです。これにより、これをより簡単に処理できるだけでなく、ファクトリを別のファクトリに簡単に置き換えることもできます。

オブジェクトの継承がどのように機能するかを知っていると思いますので、それほど単純ではなく、誰かの邪魔になり始める静的なものに対処する必要はありません。

于 2012-10-20T00:12:32.967 に答える