2012-07-27 39 views
46

如果實體是少數類的成員但不是某些類的成員,我想執行一些函數。如何檢查是否不是symfony2中的某個類的實例

有一個叫instanceof的功能。

但是有沒有像

if ($entity !instanceof [User,Order,Product]) 
+0

instanceof不是一個函數,它是一個關鍵字。不,PHP語言中沒有這樣的東西,你必須實現一個功能來自己做。 – GordonM 2012-07-27 06:28:42

回答

79

給他們一個共同的接口,然後

if (!$entity instanceof ShopEntity) 

或留在

if (!$entity instanceof User && !$entity instanceof Product && !$entity instanceof Order) 

我會避免創建任意函數只是一些字符在一個地方保存。另一方面,如果你需要「太頻繁」,你可能會有設計缺陷? (在「太多的邊緣情況」或這樣的意思)

+35

'if(!($ entity instanceof User))'會更好嗎? – DanFromGermany 2013-06-18 16:29:11

+4

@DanFromGermany沒有區別。也許可讀性。隨你便。 – KingCrunch 2014-04-25 10:49:45

+0

@KingCrunch非常概念上混淆爲什麼它沒有什麼區別?我更喜歡Dragos的回答和合理化。這是我做這件事的方式,因爲在檢查實際內容之前否定要檢查的實例似乎很髒。 – Jonathan 2016-02-25 16:49:09

1

這個功能應該這樣做:

function isInstanceOf($object, Array $classnames) { 
    foreach($classnames as $classname) { 
     if($object instanceof $classname){ 
      return true; 
     } 
    } 
    return false; 
} 

所以,你的代碼是

if (!isInstanceOf($entity, array('User','Order','Product'))); 
41

PHP手冊說:http://php.net/manual/en/language.operators.type.php

!($a instanceof stdClass) 

這僅僅是一個邏輯和「語法」正確的書面語法。

上述建議的語法雖然很棘手,因爲我們沒有詳細說明否定的範圍:變量本身或「$ var instanceof someclass」的整個構造。我們只需要依賴運營商的優先權[編輯,感謝@Kolyunya]。

!$class instanceof someClass 
+4

這是一個更清潔的解決方案。我確信有一半的人最終在這個問題上開始尋找,因爲'if(!$ entity instanceof ShopEntity)'不直觀......我們許多人使用'!$ entity'作爲'$ entity === null'。 – mimoralea 2014-10-29 22:22:41

+3

你是什麼意思?'我們只需要在這裏依賴PHP解析器的智能實現。「?語言規範明確指出'instanceof'運算符比'!'運算符具有更高的優先級。 – Kolyunya 2017-02-12 10:46:33

+1

@Kolyunya可讀性,vs「嗯,看起來很奇怪..讓我看看php的運算符優先級......好的,那就檢查出」 – 2017-06-14 02:32:37

10

PHP Operator Precedence

instanceof運營商僅僅是否定之前那麼這個表達式:

!$class instanceof someClass 

只是在PHP權利,並做你的期望。

1
function check($object) { 
    $deciedClasses = [ 
     'UserNameSpace\User', 
     'OrderNameSpace\Order', 
     'ProductNameSpace\Product', 
    ]; 

    return (!in_array(get_class($object), $allowedClasses)); 
} 
相關問題