2010-01-11 9 views
8

पर सेट करना क्या यह निम्न में से कोई एक कार्य करने के लिए बेहतर रूप है? यदि नहीं, तो उनमें से एक दूसरे की तुलना में तेज़ है?एक चर बनाम सेटिंग को '

unset($variable); 

या

$variable = ''; 

उत्तर

11

वे थोड़ा अलग काम करेंगे करने के लिए:

  • को सेट किए बिना प्रतीक मेज से चर निकाल देंगे और से सामग्री पर संदर्भ गिनती घटती होगा 1. इसके बाद चर के संदर्भ एक नोटिस ("अपरिभाषित चर") ट्रिगर करेंगे। (ध्यान दें, एक ऑब्जेक्ट __unset() को कार्यान्वित करके अपने गुणों पर डिफ़ॉल्ट अनसेट व्यवहार को ओवरराइड कर सकता है।

  • एक खाली स्ट्रिंग पर सेटिंग 1 से सामग्री पर संदर्भ गणना घट जाएगी, सामग्री को 0-लंबाई स्ट्रिंग पर सेट करें, लेकिन प्रतीक अभी भी प्रतीक तालिका में रहेगा, और आप अभी भी चर का संदर्भ दे सकते हैं। (ध्यान दें, एक ऑब्जेक्ट __set() को कार्यान्वित करके अपने गुणों पर डिफ़ॉल्ट असाइनमेंट व्यवहार को ओवरराइड कर सकता है।

पुराने PHP में, जब रेफरी गिनती 0 तक गिर जाती है, तो विनाशक को बुलाया जाता है और स्मृति तुरंत मुक्त हो जाती है। नए संस्करणों (> = 5.3) में, php एक buffered योजना का उपयोग करता है जो चक्रीय संदर्भों (http://www.php.net/manual/en/features.gc.collecting-cycles.php) के लिए बेहतर संचालन करता है, इसलिए स्मृति को बाद में मुक्त किया जा सकता है, क्योंकि इसमें कोई देरी नहीं हो सकती है ... किसी भी मामले में, वास्तव में कोई समस्या नहीं आती है और नया एल्गोरिदम कुछ स्मृति रिसाव को रोकता है।

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

यदि आप चर को बाद में जांच के लिए अमान्य के रूप में चिह्नित करना चाहते हैं, तो आप इसे गलत या शून्य पर सेट कर सकते हैं। यह जारीकर्ता() के साथ परीक्षण से बेहतर होगा क्योंकि परिवर्तनीय नाम में एक टाइपो बिना किसी त्रुटि के झूठी वापसी करेगा ... आप किसी अन्य फ़ंक्शन पर झूठे और शून्य मान भी पास कर सकते हैं और सेंटीनेल मान को बनाए रख सकते हैं, जिसे नहीं किया जा सकता एक सेट नहीं वर ...

तो मैं कहूँगा:

$var = false; ... 
if ($var !== false) ... 

या

$var = null; ... 
if (!is_null($var)) ... 

से प्रहरी मूल्यों की जाँच के लिए बेहतर होगा
2

तकनीकी तौर पर $test = ''

if(isset($test)) 

क्योंकि यह अभी भी 'सेट' है, यह सिर्फ रिक्त मान एन के लिए निर्धारित है के लिए सही वापस आ जाएगी।

हालांकि यह

if(empty($test)) 

को सच वापस आ जाएगी, क्योंकि यह एक खाली चर रहा है। यह सिर्फ उस चीज़ पर निर्भर करता है जिसके लिए आप जांच कर रहे हैं। आम तौर पर लोग यह जांचते हैं कि एक परिवर्तनीय जारीकर्ता है, भले ही यह खाली है।

तो इसे पूरी तरह से अनसेट करना बेहतर है।

इसके अलावा, इस को समझने के लिए

unset($test); 
इस

$test = ''; 

पहले तुरंत आपको बताता है कि चर नहीं अब सेट किया गया है की तुलना में

आसान है। जहां उत्तरार्द्ध बस आपको बताता है कि यह एक रिक्त स्थान पर सेट है। यह आमतौर पर तब उपयोग किया जाता है जब आप एक चर में सामान जोड़ने जा रहे हैं और नहीं चाहते कि PHP आपके ऊपर त्रुटि दे।

2

आप विभिन्न चीजें कर रहे हैं, unset का उद्देश्य निर्दिष्ट स्थान को संदर्भित करने के संदर्भ में निर्दिष्ट चर को नष्ट करना है, आपका दूसरा उदाहरण बस चर को एक खाली स्ट्रिंग पर सेट करता है।

एक चर unsetting, तत्काल स्मृति मुक्त मजबूर नहीं करता है अगर आप प्रदर्शन के बारे में चिंतित हैं, NULL चर स्थापित करने के लिए एक बेहतर विकल्प हो सकता है, लेकिन वास्तव में, अंतर ध्यान देने योग्य नहीं हो जाएगा ...

चर्चित docs में:

को सेट किए बिना() सिर्फ यह क्या नाम है करता है का कहना है - सेट किए बिना एक चर। यह तत्काल स्मृति मुक्त करने के लिए मजबूर नहीं करता है। PHP के कचरा कलेक्टर जब यह फिट देख यह करना होगा - जैसे ही मंशा, के रूप में उन CPU चक्र वैसे भी जरूरत नहीं होती है, या के रूप में देर से स्क्रिप्ट से पहले के रूप में होगा की स्मृति समाप्त रन, जो कुछ भी पहली बार होता है।

यदि आप $ = null कर रहे हैं; फिर आप चर के डेटा को फिर से लिख रहे हैं। आपको स्मृति मुक्त हो सकता है/ तेजी से संकुचित हो सकता है, लेकिन यह कोड से चक्रों को चुरा सकता है, जिन्हें वास्तव में की आवश्यकता होती है, जिसके परिणामस्वरूप अधिक समग्र निष्पादन समय होता है।

0

उनके पास बिल्कुल अलग अर्थ हैं। पूर्व एक परिवर्तनीय गैर मौजूद है। उत्तरार्द्ध बस अपने मूल्य को खाली स्ट्रिंग पर सेट करता है। इससे कोई फर्क नहीं पड़ता कि कौन सा "बेहतर" बोलने के लिए है, क्योंकि वे पूरी तरह से अलग चीजों के लिए हैं।

क्या आप स्मृति या कुछ साफ करने की कोशिश कर रहे हैं? यदि हां, तो मत करो; PHP आपके लिए स्मृति प्रबंधित करता है, ताकि आप इसे चारों ओर बिछा सकें और यह स्वचालित रूप से साफ़ हो जाएगा।

आप स्मृति को साफ करने के कोशिश नहीं कर रहे हैं, तो आप यह पता लगाने की क्यों आप एक चर सेट नहीं है या खाली करने के लिए यह निर्धारित करते हैं, और उचित एक का चयन करना चाहते हैं की जरूरत है। इसका एक अच्छा मानसिक स्वास्थ्य की जांच: मान लीजिए कि कोई कहीं के बाद कोड की निम्न पंक्ति डाला जाने अपने को सेट किए बिना/खाली:

if(strcmp($variable, '') == 0) { do_something(); } 

और फिर, बाद में:

if(!isset($variable)) { do_something_else(); } 

पहले do_something() चलेगा अगर आप सेट परिवर्तनीय खाली स्ट्रिंग के लिए। यदि आप चर को अनसेट करते हैं तो दूसरा do_something_else() चलाएगा। यदि आपकी स्क्रिप्ट ठीक तरह से व्यवहार कर रही है तो आप इनमें से कौन सा भागने की उम्मीद करते हैं?

2

मुझे लगता है कि सबसे प्रासंगिक अंतर यह है कि एक परिवर्तनीय संचार को अनसेट करना है कि परिवर्तनीय बाद के कोड द्वारा उपयोग नहीं किया जाएगा (यदि आप इसका उपयोग करने का प्रयास करते हैं तो यह ई_नेटिस की रिपोर्ट करके इसे "लागू करता है", क्योंकि jspcal ने कहा क्योंकि यह है प्रतीक तालिका में अब नहीं)।

इसलिए, यदि खाली स्ट्रिंग आपके चर के साथ जो कुछ भी कर रही है, उसके लिए कानूनी (या सेंटीनेल) मान है, तो आगे बढ़ें और इसे '' पर सेट करें। अन्यथा, यदि चर अब उपयोगी नहीं है, तो इसे परेशान करने से स्पष्ट कोड इरादा बन जाता है।

+1

मुझे विश्वास नहीं है कि किसी और ने 'E_NOTICE' का उल्लेख नहीं किया है ... मेरे भगवान, जो भी अभी भी अनदेखा करता है उसे _proper_ कंपाइलर के साथ सिर पर धक्का दिया जाना चाहिए! – Tom

0

संदर्भ पर विचार करने के लिए एक और 'गॉचाचा' है।

आप था:

$a = 'foobar'; 
$variable =& $a; 

फिर अपने दो विकल्पों में से किसी काफी अलग है क्या करना है।

$variable = ''; 

सेट दोनों $ चर और $ रिक्त स्ट्रिंग है, जहां के रूप में

unset($variable); 

जबकि प्रतीक मेज से $ चर को हटाने $ एक और $ चर के बीच की कड़ी को हटा संदर्भ के लिए एक। यह वास्तव में $ एक और $ वैरिएबल को अनलिंक करने का एकमात्र तरीका है जो किसी और संदर्भ के लिए $ चर सेट किए बिना। नोट, उदाहरण के लिए, $ चर = शून्य; यह नहीं करेगा

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