2012-07-27 16 views
46

में कुछ वर्ग के उदाहरण की जांच कैसे करें यदि मैं कुछ कार्यों को निष्पादित करना चाहता हूं यदि इकाई कुछ वर्गों का सदस्य है लेकिन कुछ नहीं।symfony2

instanceof नामक एक फ़ंक्शन है।

लेकिन वहाँ है की तरह

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

उदाहरण एक समारोह नहीं है, यह एक कीवर्ड है। और नहीं, PHP की भाषा में ऐसा कुछ भी नहीं है, आपको इसे स्वयं करने के लिए एक फ़ंक्शन को कार्यान्वित करना होगा। – GordonM

उत्तर

79

उन्हें एक आम इंटरफेस और फिर

दें
if (!$entity instanceof ShopEntity) 

या

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

मैं मनमाने ढंग से काम करता है बनाने बस एक ही जगह पर कुछ अक्षर को बचाने के लिए से बचने के हैं के साथ रहते हैं। दूसरी तरफ यदि आपको "बहुत बार" की ज़रूरत है, तो आपके पास डिज़ाइन दोष हो सकता है? ("बहुत ज्यादा बढ़त मामलों" या इस तरह के अर्थ में)

+35

'if (! ($ इकाई उदाहरण उपयोगकर्ता)) के लिए बेहतर नहीं होगा? – DanFromGermany

+4

@DanFromGermany कोई फर्क नहीं पड़ता है। शायद पठनीयता। यह आप पर निर्भर करता है। – KingCrunch

+0

@ किंग कंचन बहुत ही संकल्पनात्मक रूप से भ्रमित है कि इससे कोई फर्क नहीं पड़ता है? मैं ड्रैगोज़ का जवाब और तर्कसंगतता पसंद करता हूं। यह वही तरीका है जो मैं करता हूं, क्योंकि यह उस उदाहरण को अस्वीकार करने के लिए गंदा लगता है, जिसे आप वास्तव में जांचने से पहले जांचना चाहते हैं। – Jonathan

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

पीएचपी मैनुअल का कहना है: http://php.net/manual/en/language.operators.type.php

!($a instanceof stdClass) 

यह सिर्फ एक तार्किक और "व्याकरण की दृष्टि से" सही लिखा वाक्य रचना है।

उपरोक्त सुझाए गए सिंटैक्स हालांकि, मुश्किल है क्योंकि हम यह निर्दिष्ट नहीं कर रहे हैं कि वास्तव में अस्वीकृति का दायरा कौन सा है: चर या स्वयं "$ var varassass someclass" का पूरा निर्माण। हमें ऑपरेटर की सटीकता पर केवल भरोसा करना होगा [संपादित, @ कोलियुय्या के लिए धन्यवाद]।

!$class instanceof someClass 

सिर्फ सही PHP में है और यह है कि जैसा कि आप उम्मीद करते हैं:

!$class instanceof someClass 
+4

यह एक क्लीनर समाधान है। मुझे यकीन है कि इस प्रश्न पर आधे लोग खत्म हो गए हैं क्योंकि 'अगर ($ $ इकाई उदाहरण ShopEntity)' सहज नहीं है ... हम में से कई '$ $ इकाई' का उपयोग '$ entity === null' के रूप में करते हैं। – mimoralea

+3

आपका मतलब क्या है 'हमें केवल PHP पार्सर के स्मार्ट कार्यान्वयन पर भरोसा करना होगा।' भाषा विनिर्देश है जो स्पष्ट रूप से बताता है कि 'instanceof' ऑपरेटर की '!' ऑपरेटर की तुलना में अधिक प्राथमिकता है। – Kolyunya

+1

@ कोल्युन्या पठनीयता, बनाम "हम्म, जो अजीब लग रहा है .. मुझे php के ऑपरेटर की प्राथमिकता को देखने दो ... ठीक है, यह जांचता है" –

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

    return (!in_array(get_class($object), $allowedClasses)); 
}