2009-01-21 76 views
1

如果在實例化過程中給出無效參數,我會遇到一些問題讓我的對象正常失敗。我有一種感覺,這是一個小語法的東西,我只是需要新鮮的眼睛。任何幫助都不勝感激。類實例化失敗

class bib { 
    protected $bibid; 
    public function __construct($new_bibid) { 
     if(!$this->bibid = $this->validate_bibid($new_bibid)) { 
     echo 'me'; 
     return false; 
     } 
     //carry on with other stuff if valid bibid 
    } 

    private static function validate_bibid($test_bibid) { 
     //call this method every time you get a bibid from the user 
     if(!is_int($test_bibid)) { 
      return false; 
     } 
     return (int)$test_bibid; 
    } 
} 

請注意,我有一個'回聲我'行在那裏證明它實際上是返回false。說我在我的PHP調用此方式如下:

if(!$bib=new bib('612e436')) { 
    echo 'Error Message'; 
} else { 
    //do what I intend to do with the object 
} 

這從上面輸出我,但然後繼續進入else塊,做什麼,我打算用一個有效的對象做。

任何人都可以發現我在那裏做錯了什麼嗎?

謝謝!

+0

在構造函數的第一行發現了另一個問題 – 2009-01-21 15:21:41

回答

1

您不能在PHP中的構造函數中返回 - 該對象仍然正常創建。

您可以使用工廠或類似的東西;

if(!$bib = Bib_Factory::loadValidBib('612e436')){ 
    echo 'Error Message'; 
} else { 
    //do what I intend to do with the object 
} 

或者在構造函數中拋出異常並使用try catch而不是if語句。

+0

將一個名爲'valid'的屬性視爲不良形式,然後執行如下操作: $ bib = new bib('612e436'); if($ bib-> isValid()){// do stuff} – 2009-01-21 14:30:41

+0

我真的沒有看到它的問題,但親自如果所有的isValid方法正在做的是檢查傳遞給構造函數的var是一個整數,那麼我會在構造函數中執行檢查並拋出一個異常。但這是一天結束時的品味問題。 – Simon 2009-01-21 14:35:47

2

我在這段代碼中看到了幾個問題。

  • 首先,我覺得你想要做這樣的事情:

    $ myBib =新圍兜(); 如果($ myBib-> validate_bibid( '612e436')){ 東西..do ..}

    (或類似的東西)

    記得__construct是不正常的方法。它是一個構造函數,它不應該返回任何東西。它已經隱含地返回了你所做的新實例的引用。

  • 其次,您的validate_bibid返回一個布爾值或整數。你不會立即遇到問題,但我個人不喜歡這種風格。

  • 第三,你已經聲明瞭一個受保護的成員$ bibid,但是你不會在任何地方設置或引用它。例如,我期望它在構造函數中設置。之後,你可以不帶任何參數地調用validate_bibid。

這段代碼顯然讓你感到困惑,因爲它有一些奇怪的構造,因此不能以正常方式運行。我建議重新思考並從頭開始重寫這篇文章。

更新:

另一個問題:

我不認爲這行做什麼你認爲它的作用:

if(!$this->bibid = $this->validate_bibid($new_bibid)) { 

你大概的意思是這樣的:

if(!$this->bibid == $this->validate_bibid($new_bibid)) { 

// Or even better: 

if($this->bibid <> $this->validate_bibid($new_bibid)) { 
+0

感謝您的評論。該構造設置$ bibid與返回的驗證bibid,所以它被使用。此外,該構造會執行大量的數據庫訪問來獲取其他屬性,這就是爲什麼我試圖驗證並實例化所有步驟。我一定會考慮第2點。 – 2009-01-21 15:02:22

0

當然,您需要與==進行比較代替=這是一個分配操作。