2009-07-25 145 views
1

我曾試着問過這個問題,並且弄錯了這個問題,所以我會再試一次。放入if語句時,是否有可能使對象在默認情況下返回false?我想要的:是否有可能使對象默認返回false?

$dog = new DogObject(); 
if($dog) 
{ 
    return "This is bad;" 
} 
else 
{ 
    return "Excellent! $dog was false!" 
} 

有沒有一種方法,這是可能的?這不是完全必要的,但會爲我節省一些代碼行。謝謝!

+0

好的,讓我澄清一點,因爲我認爲在試圖簡化問題時,人們並不瞭解它的核心。所以在這裏: 我使用的是Zend Framework,這意味着我經常使用模型(對於那些不知道它們本質上是插入/更新/使用數據庫的任何快捷方式的人)。我經常在我的一個控制器中調用Users-> insertNewUser()。如果成功,它將返回一個Zend_Db_Table_Rowset。但是,可以說用戶名已經存在。我不想回復錯誤,因爲那不會告訴我哪裏出了問題。 – Ethan 2009-07-25 18:56:02

+0

我喜歡這個問題,因爲它有一個狗對象,你試過隱式重載嗎? – 2009-07-25 18:56:40

+0

相反,我創建了一個名爲modelResult的對象,它攜帶了模型未能執行其功能的原因。我想要的是能夠回到控制器中,能夠說出$ result = Users-> insertNewUser()。如果($結果){返回$結果} else {(檢查什麼WENT錯誤和說爲什麼)}。我知道我可以通過檢查$ result的類型來做到這一點。我知道有很多方法可以做到這一點。但是,我只是想知道是否可以讓我的ModelResult對象返回false,因爲它會更容易使用。有沒有辦法做到這一點?如果答案是否定的,那麼我會管理。 – Ethan 2009-07-25 19:01:01

回答

3

沒有,PHP有運算符重載的支持。也許他們會在未來的版本中添加它。

0

把一些東西放在「一個if語句」中,就是簡單地將其中的變量評估爲布爾值。

在您的示例中,$ dog將需要爲始終爲 false才能工作。沒有辦法知道什麼時候您的變量即將在布爾表達式中進行評估。

這裏您的最終目的是什麼?你想要保存哪些代碼行?

+0

好吧,從技術上來說,這裏有falsy和truthy。例如,如果你把$ string =「」,然後做如果($字符串),$字符串將被視爲false。這與int 0是一樣的。我只是想知道是否有辦法讓DogObject虛僞。 – Ethan 2009-07-25 18:44:59

+1

好的,我明白你想要做什麼。我認爲有人在你的其他線索中提到了這一點,但你真正想要做的是嘗試/捕捉。您嘗試插入,然後捕獲拋出的任何異常。 – thedz 2009-07-25 19:00:14

0

我不確定對象本身。可能。你可以嘗試類似的方法,在DogObject類中添加一個公共屬性,然後默認設置爲false。如。

class DogObject 
{ 
    var $isValid = false; 

    public function IsValid() 
    { 
     return $isValid; 
    } 
} 

然後當你實例化它時,它默認是false。

$dog = new DogObject(); 
if($dog->IsValid()) 
{ 
    return "This is bad;" 
} 
else 
{ 
    return "Excellent! $dog was false!" 
} 

只是一個想法。

+0

是的,但想法是,它會更多地沿着以下方向: $ dog = couldReturnDogObjectButCouldAlsoBeArray(); if($ dog)...等 如果$ dog不一定是DogObject,並且我調用了IsValid(),那麼我的程序就會崩潰。但是,如果我可以在if語句中使DogObject爲false,那麼當它是一個數組時,我可以返回true,並且當它是DogObject時返回false。 – Ethan 2009-07-25 18:50:06

0

如果我理解你問,我想你想這樣做:

if (!$dog){ 
    return "$dog was false"; 
} 

的!意思不是。所以你可以閱讀,「如果不是狗,或者如果狗不是真的」

+0

對不起,如果這不是你正在尋找的...如果它不只是留下一個信息,不要讓我失望很多,我無法理解你的問題......我想我會給它一個鏡頭。 – micmoo 2009-07-25 18:45:18

0

你想在什麼條件下if($dog)評估爲false?你不能做你真正要求的東西,但也許可以用一些你想要的東西取代條件。

0

如何使用像下面的C#隱式演員操作符?

像這樣:

class DogObject 
    { 
     public static implicit operator bool(DogObject a) 
     { 
      return false; 
     } 
    } 

然後你可以去...

var dog = new DogObject(); 

    if(!dog) 
    { 
     Console.WriteLine("dog was false"); 
    } 
0
class UserController 
{ 
    public function newuserAction() 
    { 
    $userModel = new UserModel(); 
    if ($userModel->insertUser()) { 
     // Success! 
    } else { 
     die($userModel->getError()); 
    } 
    } 
} 

或者

class UserController 
{ 
    public function newuserAction() 
    { 
    $userModel = new UserModel(); 
    try { 
     $userModel->insertUser() 
    } 
    catch (Exception $e) { 
     die($e); 
    } 
    } 
} 

有處理錯誤一百萬的方式。這一切都取決於錯誤的複雜性和恢復選項的數量。

2

使用instanceof關鍵字。

例如

$result = Users->insertNewUser(); 

if($result instanceof MyErrorClass){ 
    (CHECK WHAT WENT WRONG AND SAY WHY) 
} else { 
    //Go on about our business because everything worked. 
} 

Info is here.

1

使用此?不是一個真正的純溶液,但你想要做什麼:

<?php 

    class Foo 
    { 
     private $valid = false; 

     public function Bar () 
     { 
      // Do stuff 
     } 

     public function __toString () 
     { 
      return ($this -> valid) ? '1' : '0'; 
     } 
    } 

?> 

零被認爲是,一個是由PHP

認爲 真正
1

我試圖在此做自己,找到了一個解決方案,似乎工作。

爲了迴應其他人試圖通過告訴提問者使用不同的解決方案來回答問題,我也會嘗試解釋問題的原因。無論是原始海報還是我想要使用異常,因爲重點不是使用異常處理功能,而是將這種負擔放在我們使用這個類的任何代碼上。至少對我而言,這一點是能夠使用這個無縫地在其他PHP代碼中編寫,這些代碼可以用非面向對象或非基於異常的風格編寫。許多內置的PHP函數都是以這樣的方式編寫的,以致對於不成功的進程來說錯誤的結果是可取的。同時,我們可能希望能夠在我們自己的代碼中以特殊的方式處理這個對象。

例如,我們可能想要做這樣的事情:

if (!($goodObject = ObjectFactory::getObject($objectType))) { 
    // if $objectType was not something ObjectFactory could handle, it 
    // might return a Special Case object such as FalseObject below 
    // (see Patterns of Enterprise Application Architecture) 
    // in order to indicate something went wrong. 
    // (Because it is easy to do it this way.) 
    // 
    // FalseObject could have methods for displaying error information. 
} 

這裏是一個非常簡單的實現。

class FalseObject { 
    public function __toString() { 
    // return an empty string that in PHP evaluates to false 
    return ''; 
    } 
} 

$false = new FalseObject(); 

if ($false) { 
    print $false . ' is false.'; 
} else { 
    print $false . ' is true.'; 
} 

print '<br />'; 

if (!$false) { 
    print $false . ' is really true.'; 
} else { 
    print $false . ' is really false.'; 
} 

//我打印$假,只是爲了確保無意外發生的事情。

的輸出是:

是假的。 確實是錯誤的。

我測試過這一點,如果你有這個類裏面的一些聲明的變量,如它的工作原理,甚至:

class FalseObject { 
    const flag = true; 
    public $message = 'a message'; 
    public function __toString() { 
    return ''; 
    } 
} 

稍微更有趣的實現可能是:

class FalseException extends Exception { 
    final public function __toString() { 
    return ''; 
    } 
} 

class CustomException extends FalseException { } 

$false = new CustomException('Something went wrong.'); 

使用與以前相同的測試代碼,$ false評估爲false。

1

我最近不得不做類似的事情,使用null對象模式。不幸的是,null對象返回true,並且有問題的變量有時是一個實際的null值(來自函數的默認參數)。我想到的最好的方法是如果((字符串)$ var){雖然這不適用於空數組。

相關問題