2016-04-15 27 views
0

我對PHP相對比較陌生(以及一般的編程)。記住這一點。如何限制PHP中的類實例?

以下是基本情況。我正在建設一個網絡小型大學。

有兩個關鍵類:課程系列

  • 有一系列的屬性,如果這個教訓是屬於一個系列的存儲奇異LessonSeries 。它可能不會。
  • LessonSeries具有吸取的財產,課程對象將保存數組..

這兩個類具有「ID」屬性,該屬性是整數,並且將是唯一的它們的類。我的數據庫確保不會有兩個課程或兩個具有相同ID的課程系列。

在我的網站的許多頁面中,課程對象被迭代,並且(如果他們有一個系列),他們將顯示他們所屬的系列,有時使用一些其他的LessonSeries方法和屬性。

所以,這是問題:當從Db中拉出課程時,它會構建一個LessonSeries以與其相對應。但我不想在那裏存在20個相同LessonSeries的實例。某些方法觸發只需要在每個課程系列中執行一次的數據庫查詢。如果有20個實質上相同的系列實例,這可能會導致比所需更多的db活動。

我是新來的編程模式,但這裏是我我需要:

  • 我想唯一LessonSeries的註冊表。
  • 我希望每個獨特的LessonSeries都被 所屬的所有課程共享。
  • 理想情況下,我希望此功能位於LessonSeries類中,而不必擁有第二個管理員類(如果可能的話)。
  • 基本上,我想要的是,無論何時構造一個LessonSeries,都會首先檢查註冊表是否存在該id。如果是這樣,返回的是對現有課程系列的引用。如果它不存在於註冊表中,那麼它將照常創建。

這樣說,我不知道如何使這發生在PHP中。

編輯: 有人指出,在我需要證明我已經嘗試解決問題的這是一個很好的問題,各種各樣的,對這樣的意見。但那正是我的問題。

我認爲做這樣的事情:

class LessonSeries { 

private static $registry; 

public $Id; 
public $SeriesName; 
public $ImagePath; 
public $Description; 
private $index; 
private $lessons; 
private $lessonCount; 

public function __construct($seriesName, $imagePath=null, $Id=null, $description = null) { 
    if(isset(self::$registry[$id])){ 
     return self::$registry[$Id]; 
    }else{ 
     $this->SeriesName = $seriesName; 
     $this->ImagePath = $imagePath; 
     $this->Id = $Id; 
     $this->Description = $description; 
     self::$registry[$Id] = $this; 
    }  
} 

不過,我並不認爲這是多麼的PHP構造函數的工作。我想我知道如何去做我想要的東西(使用子類等),但PHP沒有子類。這就是我掙扎的地方。

+0

歡迎SO。 請閱讀[我可以問哪些主題](http://stackoverflow.com/help/on-topic) 和[如何提出一個好問題](http://stackoverflow.com/help/how-to - 問) 和[完美的問題](http://codeblog.jonskeet.uk/2010/08/29/writing-the-perfect-question/) SO是**不是免費的編碼或教程或庫尋找服務**你必須證明你已經努力解決你自己的問題。 – RiggsFolly

回答

1

以下是您可以做的事情。

  1. 創建工廠對象。在那裏移動所有創建/緩存邏輯。
  2. 將工廠傳遞給新創建的課程和系列,以便他們可以將創建委託給它。
  3. 在您的頁面代碼中,創建一個工廠。
  4. 儘量避免靜態。例如,如果你的代碼是真實的對象,你的代碼將更容易進行單元測試。

下面是一個僞代碼演示它:

class LessonsFactory { 
    private $lessons = []; 
    private $series = []; 

    public getLesson($id) { 
    if (isset($this->lessons[$id])) { 
     return $this->lessons[$id]; 
    } 
    $lesson = $this->loadLesson($id); 
    $this->lessons[$id] = $lesson; 
    $this->getSeries($lesson[$id]); 
    } 

    private loadLesson($id) { 
    $data = ... // load lesson from db 
    return new Lesson($data, $this); 
    } 

    public getSeries($id) { 
    if (isset($this->series[$id])) { 
     return $this->series[$id]; 
    } 
    $series = $this->loadSeries($id); 
    $this->series[$id] = $series; 
    } 

    private loadSeries($id) { 
    $data = ... // load series from db 
    return new LessonSeries($data, $this); 
    } 
} 


class Lesson { 
    private $factory; 

    public function __construct($data, LessonFactory $factory) { 
    $this->factory = $factory; 

    // + code to intialize object with $data 
    } 

    // this is how you get series from lessons 
    public function getSeries() { 
    return $this->factory->getSeries($this->seriesId); 
    } 
} 

// somewhere in your page controller code 
$factory = new LessonsFactory(); 
$lesson = $factory->getLesson($_GET['lessond_id']);