1

私が構築している小さなphpアプリのOOP設計を考え出すのに少し苦労しています。restaurantデータベースにレストランの情報があり、テーブルとテーブルに分割されていlocationsます。phone両方のテーブルには、 、、 などの共通の列がいくつかwebsiteありlogo urlます。locations明らかに、との関係restaurantsは多対 1 です。

問題は次のとおりです。Restaurant名前、電話番号、ウェブサイト、ロゴなど、グローバルなレストラン情報に関連するすべての情報を含むクラスを作成したいと考えています。次に、次のLocationような場所固有の情報を含むクラスを作成したいと考えています。住所、電話番号、ウェブサイト、ロゴなど

私が直面している問題は、両方のオブジェクト タイプをインスタンス化できるようにしたいだけでなくLocation、親データが存在しない場合はクラスを親データにフォールバックさせたいということです。通常、次のように記述できます (省略):

class Restaurant {

    protected $phone;

    function __construct($restaurant_id) {
        // Perform db call here and set class attributes
    }

    public function getPhone() {
        return $this->phone;
    }
}

class Location extends Restaurant {

    function __construct($location_id) {
        // Perform db call here and set class attributes

        // $restaurant_id would be loaded from the DB above
        parent::__construct($restaurant_id)
    }
}

$location = new Location(123);
echo $location->getPhone();

$restaurant = new Restaurant(456);
echo $restaurant->getPhone();

しかし、私が言ったように、getPhone() メソッドで最初に $this->phone をチェックし、存在しない場合は親にフォールバックするようにします。このようなものは正しい方法でしょうか?

class Restaurant {

    private $phone;

    function __construct($restaurant_id) {
        // Perform db call here and set class attributes
    }

    public getPhone() {
        return $this->phone;
    }
}

class Location extends Restaurant {

    private $phone;

    function __construct($location_id) {
        // Perform db call here and set class attributes

        // $restaurant_id would be loaded from the DB above
        parent::__construct($restaurant_id)
    }

    public function getPhone() {
        if(!empty($this->phone)) {
            return $this->phone;
        }
        return parent::getPhone();
    }
}

$location = new Location(123);
echo $location->getPhone();

上記のコードは本当にハッキリしているように感じます。おそらくこれを達成するためのもっと良い方法があります。Locationこの 2 つは共通の属性を持っているため、クラスを拡張せに「親」オブジェクトRestaurantの型の変数を保持するほうがよいでしょうか? Restaurant次に、Location::getPhone()メソッドで同様のif(empty())チェックを実行しますか?

4

1 に答える 1

2

LocationRestaurantそれ自体はレストランではないため、拡張しないでください。それはそのレストランの多くの場所の1つです。

class Location {
    private $restaurant;
    private $phone;

    public function getPhone() {
        return $this->phone ?: $restaurant->getPhone();
    }
}

2 つのクラス間で非常に多くのフィールドが共通しているため、それぞれが拡張する共通の基本クラス ( CompanyInfoHolderWeb サイト、電話番号、ロゴなど) を定義することができます。この場合、上記とまったく同じようにLocationオーバーライドされます。getPhone

于 2012-06-14T02:59:52.977 に答える