2016-10-06 9 views
8

मैं इस कोड की कोशिश की है:पीएचपी 7 - तुलना बेनामी कक्षा उदाहरण

$ac1 = new class {}; 
$ac2 = new class {}; 

var_dump($ac1); // object([email protected])#1 (0) {} 
var_dump($ac2); // object([email protected])#2 (0) {} 
var_dump(new class {}); // object([email protected])#3 (0) {} 

var_dump($ac1 == $ac2); // bool(false) 
var_dump($ac1 == new class {}); // bool(false) 
var_dump($ac2 == new class {}); // bool(false) 

ऊपर तुलना का परिणाम सभी झूठी हैं।

function anonymous_class() { 
    return new class {}; 
} 

$ac1 = anonymous_class(); 
$ac2 = anonymous_class(); 

var_dump($ac1); // object([email protected])#1 (0) {} 
var_dump($ac2); // object([email protected])#2 (0) {} 
var_dump(anonymous_class()); // object([email protected])#3 (0) {} 

var_dump($ac1 == $ac2); // bool(true) 
var_dump($ac1 == anonymous_class()); // bool(true) 
var_dump($ac2 == anonymous_class()); // bool(true) 

सभी मुद्रित सच:

हालांकि, जब मैं एक समारोह है कि एक गुमनाम वर्ग रिटर्न की घोषणा, यह परिणाम है।

अब सवाल यह है कि यह कैसे हुआ? विशेष रूप से, यह दूसरे संदर्भ के लिए सच क्यों मुद्रित किया गया, यह जानकर कि प्रत्येक var_dump() उदाहरणों के परिणामस्वरूप अलग-अलग परिणाम हुए?

+4

एक तेज़ और ढीले उत्तर के रूप में: आपके पहले नमूने में आपके पास तीन अलग-अलग "भौतिक" वर्ग की घोषणाएं हैं, जो तीन अलग-अलग वर्ग बनती हैं। दूसरे नमूने में, आपके पास केवल एक 'वर्ग' है, और इसके तीन उदाहरण हैं। – deceze

+0

@deceze आपने एक अच्छा सारांश दिया। इसे जवाब क्यों न दें? –

+0

@chumkiu पहले से ही एक अच्छा काम किया है। – deceze

उत्तर

5

डॉक http://php.net/manual/en/language.oop5.anonymous.php

सभी वस्तुओं एक ही गुमनाम वर्ग घोषणा के द्वारा बनाई गई है कि बहुत से वर्ग के उदाहरण हैं।

<?php 
function anonymous_class() 
{ 
    return new class {}; 
} 

if (get_class(anonymous_class()) === get_class(anonymous_class())) { 
    echo 'same class'; 
} else { 
    echo 'different class'; 
} 
ऊपर के उदाहरण

उत्पादन होगा: एक ही कक्षा

और http://php.net/manual/en/language.oop5.object-comparison.php

तुलना ऑपरेटर == का उपयोग करते समय से, वस्तु चर, एक सरल तरीके से तुलना की जाती है अर्थात्: दो ऑब्जेक्ट उदाहरण बराबर हैं यदि उनके पास समान गुण और मान हैं (मानों की तुलना ==) है , और एक ही कक्षा के उदाहरण हैं।

+0

हां मैंने इसे पढ़ लिया है, लेकिन प्रत्येक उदाहरण के 'var_dump()' आउटपुट की जांच करें, वे अलग हैं। –

+3

@ रैक्स कक्षा नाम के बाद '# 1' * इंस्टेंस काउंटर * (' कक्षा @ अज्ञात' का पहला उदाहरण) है। कक्षा का नाम सभी मामलों में समान है। – deceze

+0

आपके उत्तर और @ धोखे का मिश्रण मुझे इसके बारे में स्पष्ट दृश्य देता है। बहुत बढ़िया। –

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