2011-04-06 20 views
18

करने के लिए वस्तु का मूल्यांकन निम्नलिखित पर विचार करें:एक बूलियन

class MyClass 
{ 
    private $var1 = "apple"; 
    private $var2 = "orange"; 
} 

$obj = new MyClass(); 

if($obj) { 
    // do this 
} 
else { 
    // do that 
} 

पीएचपी सच करने के लिए अपने वस्तु का मूल्यांकन करता है, क्योंकि यह सदस्य चर है। क्या यह तर्क किसी भी तरह से ओवरराइड किया जा सकता है? दूसरे शब्दों में, क्या मैं इस बात पर नियंत्रण कर सकता हूं कि मेरी कक्षा का कोई उद्देश्य बूलियन के रूप में कब व्यवहार करेगा?

+0

नहीं, अभी के रूप में, हम केवल यह स्ट्रिंग कास्टिंग में नियंत्रित कर सकते हैं। – Wrikken

+0

आपको असामान्य व्यवहार क्यों करने की आवश्यकता है? –

+1

बूलियन मूल्यांकन के बदले आप सबसे अच्छा प्राप्त कर सकते हैं 'अगर ($ obj()) 'या' if ("$ obj") 'या' if (count ($ obj))। – mario

उत्तर

16

PHP मेरी ऑब्जेक्ट को सत्य पर मूल्यांकन करता है क्योंकि इसमें सदस्य चर हैं।

यह गलत है। PHP वास्तव में $obj का मूल्यांकन true के रूप में करता है क्योंकि इसमें कोई ऑब्जेक्ट होता है। ऑब्जेक्ट की सामग्री के साथ इसका कोई लेना-देना नहीं है। आप सदस्यों को अपनी कक्षा परिभाषा से हटाकर इसे सत्यापित कर सकते हैं, इससे कोई फर्क नहीं पड़ता कि किस शाखा में/else चुना गया है।

PHP को चर के रूप में एक चर का मूल्यांकन करने का कोई तरीका नहीं है यदि यह किसी ऑब्जेक्ट का संदर्भ रखता है। आप चर पहले करने के लिए निम्न में से एक आवंटित करने के लिए होगा:

null 
array() 
"" 
false 
0 
+2

सच है। ओपी के लिए स्पष्टीकरण के लिए, '$ obj' वस्तु नहीं है।इसके बजाय, यह ऑब्जेक्ट के स्थान पर एक * संदर्भ * है, जिसका उपयोग PHP द्वारा किया जाता है ताकि स्मृति में बिंदु ढूंढ सके जहां वास्तविक वस्तु शुरू होती है। – AgentConundrum

6

नहीं, आप नहीं कर सकते हैं। दुर्भाग्य से php में बूलियन कास्टिंग संशोधित नहीं है, और एक ऑब्जेक्ट हमेशा बूलियन में परिवर्तित होने पर सत्य वापस आ जाएगा।

जब से तुम स्पष्ट रूप से कुछ तर्क हैं आप, कि नियंत्रण बयान में जगह क्यों अपनी वस्तु पर एक विधि को परिभाषित नहीं (कहते हैं कि "अगर है()") की स्थिति आप जांच करने के लिए और उसके बाद की जगह इच्छा की जाँच करता है कि मतलब है:

if ($obj) 

साथ:

if ($obj->isValid()) 
+0

हाँ, मुझे लगता है कि मुझे यही करना होगा, लेकिन मैं बस थोड़ी सी कोडिंग को सरल बनाना चाहता था। –

15

सबसे अच्छा तुम कर सकते हो __invoke उपयोग कर रहा है:

class MyObject { 

    private $_state; 

    public function __construct($state = false) { 
     $this->_state = $state; 
    } 

    public function __invoke() { 
     return $this->_state; 
    } 

} 

$true = new MyObject(true); 
$false = new MyObject(false); 

var_dump($true()); // true 
var_dump($false()); // false 
-2

आपको लगता है कि जैसे कि यह कर सकते हैं: (bool) $ yourObject

2

आप php7 के लिए छोटा सा एक्सटेंशन का उपयोग कर सकते हैं: https://github.com/p1ncet/obcast। आप वर्णन से देख सकते हैं, यह नई आंतरिक इंटरफ़ेस Boolable को लागू करने से बूलियन को कोई चीज कास्ट करने के लिए अनुमति देता है:

$obj = new class implements Boolable { 
    public $container = []; 
    public function __toBoolean() { 
     return count($this->container) > 0; 
    } 
}; 

var_dump((bool) $obj); 

$obj->container = [1]; 
var_dump((bool) $obj); 

उत्पादन:

bool(false) 
bool(true) 
+1

अजीब क्यों यह एक अंतर्निहित फ़ंक्शन नहीं है। मैं 5.2 5.2 के बाद से '__toString()' की उपस्थिति के कारण ऐसा होने की अपेक्षा करता हूं –

0

देर से आने के लिए क्षमा करें, लेकिन मैं सिर्फ समान के साथ खेला कार्य और किसी प्रकार का हैक/वर्कअराउंड बनाया है। नोटिस "$object" पैटर्न जो __toString विधि पर कॉल करता है।

class tst { 
    public $r = true; 
    function __toString() { return $this->r ? "1" : "0"; } 
} 
$object = new tst(); 
$object->r = true; 
echo '<br />1: '; 
if ("$object") echo 'true!'; else echo 'false!'; // "$object" becomes "1" == true 
//echo "$object" ? 'true!' : 'false!'; 

$object->r = false; 
echo '<br />0: '; 
echo "$object" ? 'true!' : 'false!'; // "$object" becomes "0" == false 

आउटपुट:

1: true! 
0: false! 
संबंधित मुद्दे