2009-11-06 21 views
139

PHP5 में, const और static का उपयोग करने के बीच क्या अंतर है? जब प्रत्येक उचित है? और क्या भूमिका public, protected और private खेलने करता है - यदि कोई हो।PHP5: कॉन्स बनाम स्थैतिक

उत्तर

151

कक्षा के संदर्भ में, स्थैतिक चर वर्ग वर्ग (वस्तु नहीं) दायरे पर हैं, लेकिन एक स्थिरांक के विपरीत, उनके मूल्यों को बदला जा सकता है।

class ClassName { 
    static $my_var = 10; /* defaults to public unless otherwise specified */ 
    const MY_CONST = 5; 
} 
echo ClassName::$my_var; // returns 10 
echo ClassName::MY_CONST; // returns 5 
ClassName::$my_var = 20; // now equals 20 
ClassName::MY_CONST = 20; // error! won't work. 

लोक, संरक्षित, और निजी consts के संदर्भ में अप्रासंगिक हैं (जो हमेशा सार्वजनिक कर रहे हैं); वे स्थिर चर सहित वर्ग चर, के लिए उपयोगी होते हैं।

  • क्लासनाम :: $ चर के माध्यम से सार्वजनिक स्थैतिक चर का उपयोग कहीं भी किया जा सकता है।
  • संरक्षित स्थैतिक चर को परिभाषित वर्ग या क्लासनाम :: $ चर के माध्यम से कक्षाओं तक विस्तारित किया जा सकता है।
  • निजी स्थैतिक चर केवल className :: $ चर के माध्यम से परिभाषित करने वर्ग द्वारा पहुँचा जा सकता।

संपादित करें: यह ध्यान रखें कि PHP 7.1.0 introduced support for specifying the visibility of class constants महत्वपूर्ण है।

+24

मैं सुरक्षित स्थिर और निजी स्थैतिक चर के लिए 'self :: $ variable' का उपयोग करना पसंद करता हूं क्योंकि मैं कक्षा के नाम को केवल एक ही बार में वर्णित करना चाहता हूं जो बहुत ही है कक्षा की शुरुआत – Lukman

+3

हां, अच्छा बिंदु, मैंने यह उल्लेख करने की उपेक्षा की कि वर्ग के भीतर से संदर्भित होने पर स्वयं कीवर्ड का उपयोग किया जा सकता है। ऊपर दिए गए उदाहरण कक्षा परिभाषा के बाहर किए गए थे, इस मामले में कक्षा का नाम इस्तेमाल किया जाना चाहिए। –

+0

ग्रेट उत्तर, स्वीकार करने के बहुत करीब है। क्या आप कृपया एक बिंदु स्पष्ट कर सकते हैं: "सार्वजनिक, संरक्षित और निजी कॉन्स के संदर्भ में अप्रासंगिक हैं" - क्यों? डिफ़ॉल्ट रूप से सभी जनता के आधार पर हैं? सभी निजी? –

3

कक्षा विधि या संपत्ति को स्थिर के रूप में घोषित करना कक्षा के तत्कालता के बिना उन्हें सुलभ बनाता है।

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

निजी, सार्वजनिक और संरक्षित एक्सेस संशोधक हैं जो वर्णन करते हैं कि कौन सा पैरामीटर/विधि एक्सेस कर सकता है।

सार्वजनिक माध्यम से सभी अन्य वस्तुओं तक पहुंच प्राप्त होती है। निजी का मतलब है कि केवल तत्काल कक्षा को पहुंच मिलती है। संरक्षित मतलब है कि तत्काल कक्षा और व्युत्पन्न कक्षाओं तक पहुंच प्राप्त होती है।

9

लगातार सिर्फ एक स्थिर है, यानी आप घोषित करने के बाद अपने मूल्य नहीं बदल सकते।

स्टेटिक परिवर्तनीय कक्षा के उदाहरण के बिना सुलभ है और इसलिए कक्षा के सभी उदाहरणों के बीच साझा किया जाता है।

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

function foo() 
{ 
    static $numOfCalls = 0; 
    $numOfCalls++; 
    print("this function has been executed " . $numOfCalls . " times"); 
} 
15

एक आखिरी बिंदु जिसे बनाया जाना चाहिए वह यह है कि एक स्थिर हमेशा स्थिर और सार्वजनिक होता है।इसका मतलब यह है कि आप ऐसा तरह वर्ग के भीतर से स्थिरांक पहुँच सकते हैं:

echo MyClass::MYCONST; 
+1

यह घोषणा सच है? कि "कॉन्स हमेशा स्थिर और सार्वजनिक है"? –

+6

यह अब सत्य नहीं है। PHP 7.1 वर्ग स्थिरांक के रूप में निजी या संरक्षित घोषित किया जा सकता है। देखें [आरएफसी] (https://wiki.php.net/rfc/class_const_visibility) – DisgruntledGoat

2

तो @Matt महान जवाब पर संक्षेप में:

class MyClass 
{ 
    const MYCONST = true; 
    public function test() 
    { 
      echo self::MYCONST; 
    } 
} 

कक्षा के बाहर से आप इसे इस तरह का उपयोग होता

  • तो स्थिरांक एक विकल्प नहीं हैं ज्यादातर स्थितियों में आप एक निजी/संरक्षित स्टेटिक संपत्ति की आवश्यकता होगी।

  • संपत्ति आप की जरूरत सार्वजनिक रूप से उपलब्ध करने के लिए है, लेकिन नहीं बदला है, एक निरंतर उचित विकल्प है।

उदाहरण:

class User{ 
    private static $PASSWORD_SALT = "[email protected]~#asd1"; 
    ... 
} 

class Product{ 
    const INTEREST = 0.10; 
    ... 
} 
2

जब वर्ग विरासत आप self और static प्रमुख शब्दों का उपयोग करके निरंतर या अलग-अलग दायरों में चर के बीच अंतर कर सकते हैं बारे में बात कर।

class Person 
{ 
    static $type = 'person'; 

    const TYPE = 'person'; 

    static public function getType(){ 
     var_dump(self::TYPE); 
     var_dump(static::TYPE); 

     var_dump(self::$type); 
     var_dump(static::$type); 
    } 
} 

class Pirate extends Person 
{ 
    static $type = 'pirate'; 

    const TYPE = 'pirate'; 
} 

और फिर कार्य करें::

$pirate = new Pirate(); 
$pirate::getType(); 

या:

Pirate::getType(); 

आउटपुट: इस उदाहरण जो तक पहुंचने का तरीका क्या दिखाता है की जाँच करें

string(6) "person" 
string(6) "pirate" 
string(6) "person" 
string(6) "pirate" 
2

यहाँ बातें मैं अब तक स्थिर सदस्यों के बारे में सीखा है, लगातार चर और पहुँच संशोधक (, निजी सार्वजनिक और सुरक्षित)। लगातार

परिभाषा

नाम की तरह कहते हैं एक निरंतर चर के मान changed.Constants कि में सामान्य चर से अलग आप यह घोषणा करते या उनका उपयोग करने के लिए $ प्रतीक का उपयोग नहीं करते नहीं किया जा सकता ।

मूल्य स्थिर अभिव्यक्ति, नहीं (उदाहरण के लिए) एक चर, एक संपत्ति, गणितीय प्रक्रिया का एक परिणाम है, या एक समारोह कॉल किया जाना चाहिए।

नोट: चर का मान एक कीवर्ड नहीं हो सकता है (उदा। स्वयं, पैरेंट और स्थैतिक)।

php में एक निरंतर घोषणा

<?php 
class constantExample{ 

    const CONSTANT = 'constant value'; //constant 

} 
?> 

लगातार की गुंजाइश वैश्विक है और एक आत्म कीवर्ड

<?php 
class MyClass 
{ 
    const CONSTANT = 'constant value'; 

    function showConstant() { 
     echo self::CONSTANT . "\n"; 
    } 
} 

echo MyClass::CONSTANT . "\n"; 

$classname = "MyClass"; 
echo $classname::CONSTANT . "\n"; // As of PHP 5.3.0 

$class = new MyClass(); 
$class->showConstant(); 

echo $class::CONSTANT."\n"; // As of PHP 5.3.0 

?> 

स्टेटिक का उपयोग कर पहुँचा जा सकता है

परिभाषा

स्टेटिक कीवर्ड का उपयोग क्लास, सदस्य फ़ंक्शन या वेरिएबल घोषित करने के लिए किया जा सकता है। क्लास में स्टेटिक सदस्य ग्लोबल को एक स्व-कीवर्ड का उपयोग करके भी एक्सेस किया जा सकता है। कक्षा गुणों या विधियों को स्थिर करने के लिए उन्हें तत्काल आवश्यकता के बिना सुलभ बनाता है कक्षा का स्थैतिक के रूप में घोषित संपत्ति को तत्काल वर्ग वस्तु (हालांकि एक स्थिर विधि कर सकते हैं) के साथ उपयोग नहीं किया जा सकता है। यदि कोई दृश्यता घोषणा (सार्वजनिक, निजी, संरक्षित) का उपयोग नहीं किया जाता है, तो संपत्ति या विधि का इलाज किया जाएगा जैसे कि इसे सार्वजनिक घोषित किया गया था। क्योंकि स्थैतिक विधियां बनाई गई वस्तु के उदाहरण के बिना कॉल करने योग्य हैं।

नोट: ->

के रूप में पीएचपी 5.3.0 के रूप में static.Static गुण तीर ऑपरेटर का उपयोग वस्तु के माध्यम से पहुँचा नहीं जा सकता इस छद्म चर $ विधि घोषित अंदर उपलब्ध नहीं है , एक चर का उपयोग कर वर्ग का संदर्भ देना संभव है। > चर का मान एक कीवर्ड नहीं हो सकता है (उदा। स्वयं, अभिभावक और स्थैतिक)।

स्टेटिक संपत्ति उदाहरण

<?php 
class Foo 
{ 
    public static $my_static = 'foo'; //static variable 

    public static function staticValue() { //static function example 
     return self::$my_static; //return the static variable declared globally 
    } 
} 

?> 

स्थिर गुणों और कार्यों उदाहरण

<?php 
    print Foo::$my_static . "\n"; 

    $foo = new Foo(); 
    print $foo->staticValue() . "\n"; 
    print $foo->my_static . "\n";  // Undefined "Property" my_static 

    print $foo::$my_static . "\n"; 
    $classname = 'Foo'; 
    print $classname::$my_static . "\n"; // As of PHP 5.3.0 

    print Bar::$my_static . "\n"; 
    $bar = new Bar(); 
    print $bar->fooStatic() . "\n"; 

?> 

सार्वजनिक, निजी, संरक्षित (A.K.A पहुँच संशोधक)

को एक्सेस करना

नीचे परिभाषा को पढ़ने से पहले, Encapsulation यह के बारे में इस लेख को पढ़ने के आप अवधारणा और अधिक गहराई से समझने के लिए

Link 1 wikipedia

Tutorials point link about encapsulation

परिभाषा

निजी, सार्वजनिक उपयोग करना मदद मिलेगी, संरक्षित कीवर्ड जो आप कक्षा में सदस्यों तक पहुंच नियंत्रित कर सकते हैं। कक्षा के सदस्यों ने घोषित किया कि जनता को हर जगह पहुंचा जा सकता है। घोषित सदस्यों को संरक्षित किया जा सकता है केवल कक्षा के भीतर और वंचित और अभिभावक वर्गों द्वारा ही। सदस्यों को निजी घोषित किया जा सकता है केवल सदस्य द्वारा परिभाषित किया जा सकता है जो सदस्य को परिभाषित करता है।

उदाहरण

<?php 
class Example{ 
public $variable = 'value'; // variable declared as public 
protected $variable = 'value' //variable declared as protected 
private $variable = 'value' //variable declared as private 

public function functionName() { //public function 
//statements 
} 

protected function functionName() { //protected function 
//statements 
} 
    private function functionName() { //private function 
    //statements 
    } 

} 
?> 

सार्वजनिक, निजी तक पहुंचना और उसे संरक्षित सदस्यों उदाहरण

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

<?php 
    class Example{ 
    public $pbVariable = 'value'; 
    protected $protVariable = 'value'; 
    private $privVariable = 'value'; 
    public function publicFun(){ 

    echo $this->$pbVariable; //public variable 
    echo $this->$protVariable; //protected variable 
    echo $this->privVariable; //private variable 
    } 

    private function PrivateFun(){ 

//some statements 
    } 
    protected function ProtectedFun(){ 

//some statements 
    } 

    } 


$inst = new Example(); 
$inst->pbVariable = 'AnotherVariable'; //public variable modifed from outside 
echo $inst->pbVariable; //print the value of the public variable 

$inst->protVariable = 'var'; //you can't do this with protected variable 
echo $inst->privVariable; // This statement won't work , because variable is limited to private 

$inst->publicFun(); // this will print the values inside the function, Because the function is declared as a public function 

$inst->PrivateFun(); //this one won't work (private) 
$inst->ProtectedFun(); //this one won't work as well (protected) 

    ?> 

अधिक जानकारी के लिए दृश्यता के बारे में इस php दस्तावेज़ पढ़ें Visibility Php Doc

संदर्भ: php.net

मुझे आशा है कि आप अवधारणा को समझा। पढ़ने के लिए धन्यवाद :) :) एक अच्छा एक

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