2014-05-22 21 views
10

मैं एक अप्रत्याशित निम्न का उपयोग करने की कोशिश कर व्यवहार का सामना करना पड़ रहा हूँ:instanceof और नामस्थान

$object instanceof $class 

1/पीएचपी 'instanceof' कीवर्ड और नामस्थान, अच्छी तरह से एक साथ काम करने के रूप में समझाया in the official doc.

2/कभी कभी, तथापि , बैकस्लैश एस्केपिंग अधिक सूक्ष्म (अस्पष्ट?) व्यवहार में देता है, क्योंकि बेन ने this अच्छी पोस्ट में कृपया समझाया।

var_dump($object, $class); 
var_dump($object instanceof $class); 

जब मेरी स्क्रिप्ट चलाने जो मेरा पीछा उत्पादन देता है:

class Tools\Tests\Entity\testObject#226 (2) { 
    private $var_one => 
    NULL 
    private $var_two => 
    NULL 
} 
string(36) "Tools\Tests\Entity\testObject" 
bool(false) 

मेरी पहली के वर्ग

कहीं गहरी मेरी कोड में नीचे, वाई पालन डंप के एक जोड़े के लिए सेट डंप मेरे दूसरे डंप में स्ट्रिंग के रूप में सख्ती से वही है। हालांकि, मेरा उदाहरण डंप वापस लौटाता है। क्यूं कर ?

मैंने बिना किसी किस्मत के बैकस्लाश के साथ खेला। शायद मैं नामस्थान के साथ कहीं गड़बड़ कर दिया? बात यह है कि मैं वास्तव में नहीं जानता कि आगे कैसे समस्या निवारण करें। मुझे क्या करना चाहिए?

+0

का उपयोग ओह, और मैं सिर्फ जाँच की मेरे नाम स्थान ... – mika

+1

उपयोग एकल उद्धरण ... – Deadooshka

उत्तर

14

आप नामस्थानों का उपयोग कर उदाहरणों के लिए परीक्षण कर सकते हैं, लेकिन fully qualified class name का उपयोग करें।

अपने परीक्षण के लिए मैं इस करना होगा:

$class = "\\Tools\\Tests\\Entity\\testObject"; 
$object = new $class; 
var_dump($object instanceof $class); //bool(true) 

तुम भी एकल उद्धरण का उपयोग कर इस तरह से परीक्षण कर सकते हैं और अपने बैकस्लैश से बचने के बारे में चिंता और कुछ कीस्ट्रोक्स खुद नहीं बचा।

$class = '\Tools\Tests\Entity\testObject'; 
$object = new $class; 
var_dump($object instanceof $class); //bool(true) 
+0

उत्कृष्ट में कोई php कीवर्ड है! यह उन स्लेशों का एक संयोजन है जो मैंने कोशिश नहीं की ... और यह वास्तव में ठीक है :) – mika

+0

@mika मदद करने के लिए खुशी! मैं अपने सभी उदाहरणों का इस तरह से परीक्षण करता हूं इसलिए मुझे नेमस्पेस पदानुक्रम के माध्यम से गलत तरीके से ट्रैवर्स करने की चिंता नहीं है। – Crackertastic

+0

बैकस्लाश से बच निकले डबल कोटेशन चिह्न के बारे में है, क्योंकि आप वहां \ \ t' प्राप्त करते हैं। सिंगल कोटेशन मार्क पार्स नहीं किया गया है, इसलिए बैकस्लाश से बचने की आवश्यकता नहीं है। – Deadooshka

3

मैं सरल संस्करण

var_dump($object instanceof \Tools\Tests\Entity\testClass); 
+0

यदि आप एक चर से नामस्थान और कक्षा को पढ़ने की जरूरत नहीं है तो यह अधिक उपयुक्त है। अगर इसका नामस्थान "इस्तेमाल" किया गया है तो बस कक्षा के नाम का उपयोग कर भी काम करता है। +1 – Adambean

संबंधित मुद्दे