2010-03-07 17 views
13

में स्थिर बनाम मैं एक वर्ग के लिए एक स्थिरांक मूल्य की घोषणा कर सकते हैं:स्थिरांक PHP5 में पीएचपी

class config 
{ 
    const mailserver = 'mx.google.com'; 
} 

लेकिन मैं भी सार्वजनिक स्थिर घोषणा कर सकते हैं:

class config 
{ 
    public static $mailserver = 'mx.google.com'; 
} 

एक कॉन्फ़िग फ़ाइल के मामले में जो मैं बाद में हमें, जैसे:

imap_connect(config::$mailserver ... 
imap_connect(config::mailserver ... 

आपको लगता है कि कौन सा विकल्प उपयोग करना बेहतर है ?? (तेज़, कम मेमोरी लोड, आदि ..)

धन्यवाद।

उत्तर

43

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

1

यह भी ध्यान दें कि योकॉबी ने ऊपर क्या कहा है, कुछ ऐसी चीजें हैं जो आप स्थिर वैरिएबल के साथ कर सकते हैं जो आप कॉन्स्ट के साथ नहीं कर सकते हैं, उदाहरण के लिए चर के लिए रनटाइम विधि कॉल का परिणाम असाइन करें।

8

उपयोग समारोह वापसी वैश्विक

0,0096, 0.0053, 0.0056, 0.0054, 0.0072, 0.0063, 0.006, 0.0054, 0.0054, 0.0055, 0.005, 0.0057, 0.0053, 0.0049, 0.0064, 0.0054, 0.0053, 0.0053, 0.0061, 0.0059, 0.0076, config1

उपयोग करते हैं, उदाहरण के सामान्य वर्ग

0,0101, 0.0089, 0.0105, 0.0088, 0.0107, 0.0083, 0.0094, 0.0081, 0.0106, 0.0093, 0.0098, 0.0092, 0.009, 0.0087, 0.0087, 0.0093 मिल 0.00 9 5, 0.0101, 0.0086, 0.0088, 0.0082, config2

उपयोग स्थिर वर

0,0029, 0.003, 0.003, 0.0029, 0.0029, 0.0029, 0.003, 0.0029, 0.003, 0.0031, 0.0032, 0.0031, 0.0029, 0.0029, 0.0029, 0.0029, 0.0031, 0.0029, 0.0029, 0.0029, 0.0029, config3

उपयोग स्थिरांक वर 0.0033, 0.0031, 0.0031, 0.0031, 0.0031, 0.0031, 0.0032, 0.0031, 0.0031, 0.0031, 0.0031, 0.0034, 0.0031, 0.0031, 0.0033, 0.0031, 0.0037, 0.0031, 0.0031, 0.0032, 0.0031 , config4

function getTime() { 
    $timer = explode(' ', microtime()); 
    $timer = $timer[1] + $timer[0]; 
    return $timer; 
} 

$config["time"] = "time"; 

class testconfig2 
{ 
    public $time = "time"; 
    static $instance; 
    static function getInstance() 
    { 
     if(!isset(self::$instance)) 
      self::$instance = new testconfig2(); 
     return self::$instance; 
    } 
} 

class testconfig3 
{ 
    static $time = "time"; 
} 

class testconfig4 
{ 
    const time = "time"; 
} 

function getConfig1() 
{ 
    global $config; 
    return $config; 
} 

$burncount = 2000; 
$bcount = 22; 

for($lcnt =1;$lcnt < $bcount;$lcnt++){ 
$start = getTime(); 
for($i=1;$i< $burncount;$i++) 
{ 
    $gs=getConfig1(); 
    $t = $gs["time"]; 
} 
$end = getTime(); 
echo round($end - $start,4).', '; 
} 
echo ' config1<br/>'; 



for($lcnt =1;$lcnt < $bcount;$lcnt++){ 
$start = getTime(); 
for($i=1;$i< $burncount;$i++) 
{ 
    $gs=testconfig2::getInstance(); 
    $t = $gs->time; 
} 
$end = getTime(); 
echo round($end - $start,4).', '; 
} 
echo ' config2<br/>'; 



for($lcnt =1;$lcnt < $bcount;$lcnt++){ 
$start = getTime(); 
for($i=1;$i< $burncount;$i++) 
{ 
    $gs=testconfig3::$time; 
    $t = $gs; 
} 
$end = getTime(); 
echo round($end - $start,4).', '; 
} 
echo ' config3<br/>'; 



for($lcnt =1;$lcnt < $bcount;$lcnt++){ 
$start = getTime(); 
for($i=1;$i< $burncount;$i++) 
{ 
    $gs=testconfig4::time; 
    $t = $gs; 
} 
$end = getTime(); 
echo round($end - $start,4).', '; 
} 
echo ' config4<br/>'; 
?> 

3

स्थिरांक और स्थिर बीच एक और अंतर यह है कि कुछ चर ली ke सरणियों वर्ग स्थिरांक में अनुमति दी जाती है, इसलिए

class mytest 
{ 
    public static $c = array(1=> 'hello', 2=>'world'); 
} 

काम करता है, लेकिन

class mytest 
{ 
    const c = array(1=> 'hello', 2=>'world'); 
} 

नहीं होगा।

+3

PHP5.6 – Raffaello

4

आप डिफ़ॉल्ट फ़ंक्शन तर्क मानों के लिए स्थिरांक का उपयोग कर सकते हैं, जहां स्थैतिक चर की अनुमति नहीं है।

+0

के बाद से अब सत्य नहीं है, हालांकि यह एक वैध बिंदु है, लेकिन यह इस सवाल को संबोधित नहीं करता है कि "कौन सा उपयोग किया जा सकता है?"। शायद, अगर सवाल "इस परिदृश्य में * उपयोग करने के लिए बेहतर है *", हाँ - लेकिन समग्र, नहीं। – newfurniturey

+1

@ न्यूफर्जेरी, मैं आपकी टिप्पणी से असहमत हूं। एक या दूसरे की सीमा को इंगित करने से पता चलता है कि दूसरा कैसे बेहतर हो सकता है। और, ऐसा लगता है कि चूंकि यह सबसे लोकप्रिय और स्वीकृत उत्तर का तर्क है, मुझे नहीं लगता कि मैं इसमें अकेला हूं। – mkoistinen

-2

दोनों 'कॉन्स्ट' और 'सार्वजनिक स्थैतिक' बुराई हैं!

जैसा किथ हम्म ने नोट किया - एक कॉन्स रनटाइम विधि का परिणाम नहीं हो सकता है।और, हालांकि मैंने शुरू में सोचा था कि वह कहने में सही था कि आप "रनटाइम विधि कॉल (एक स्थैतिक) चर के परिणाम को असाइन कर सकते हैं", मेरा परीक्षण दिखा रहा है कि आपको ऐसा करने के लिए कुछ हुप्स से कूदना होगा।

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

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

ऑब्जेक्ट ओरिएंटेड कोड मानते हुए, मैंने कई भाषाओं के लिए सामान्य सलाह का पालन किया है, और PHP के लिए अतिरिक्त जोर देने की आवश्यकता है - किसी भी प्रकार की दृश्य संपत्तियों को छोड़कर चाहे स्थिर, स्थिर या कुछ और हो। 'गेटर' विधियों का प्रयोग करें!

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

देखें: Tjeerd Visser का जवाब How to initialize static variables का उत्तर दें और इसे एक टक्कर दें। अपने विरोधियों को अनदेखा करें - यदि आप प्रदर्शन से संबंधित हैं, संभावित बग और अन्य आपदाओं से ऊपर, तो दूसरी भाषा पर स्विच करें।

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