私が構築している小さな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())
チェックを実行しますか?