PHP 5: स्थैतिक बनाम स्थिर


167

PHP 5 में, उपयोग करने constऔर के बीच क्या अंतर है static?

प्रत्येक उपयुक्त कब है? और क्या भूमिका करता है public, protectedऔर privateखेलता है - यदि कोई हो?

जवाबों:


187

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

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.

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

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

संपादित करें: यह ध्यान रखना महत्वपूर्ण है कि PHP 7.1.0 ने कक्षा में रहने वाले लोगों की दृश्यता को निर्दिष्ट करने के लिए समर्थन पेश किया


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

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

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

1
क्या स्थैतिक संस्करण की आवश्यकता नहीं है $? static $my_var = 10;परिभाषा में
डैनियल डब्ल्यू।

पुराना धागा, लेकिन मैं कुछ जोड़ना चाहूंगा: php.net/manual/en/… देखें , जो बताते हैं कि staticचर एकल और पुनरावर्ती कार्यों में भी बहुत उपयोगी हैं। क्योंकि आप मान बदल सकते हैं लेकिन चर केवल एक बार आरंभिक होगा। कैसे एक एकल बनाने के लिए आगे की व्याख्या के लिए stackoverflow.com/questions/203336/… देखें । मेरे लिए वे कुछ स्थितियाँ हैं जिनमें मैं स्थिर चर पसंद करता हूँ।
एरिक वैन डी वें

20

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

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

कक्षा के बाहर से आप इसे इस तरह एक्सेस करेंगे:

echo MyClass::MYCONST;

1
क्या यह घोषणा सत्य है? कि "कास्ट हमेशा स्थिर और सार्वजनिक है"?
अपिल.तामांग

7
यह अब सच नहीं है। PHP के रूप में 7.1 वर्ग स्थिरांक को निजी या संरक्षित घोषित किया जा सकता है। RFC
असंतुष्ट

11

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

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

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

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

7

जब क्लास इनहेरिटेंस के बारे में बात कर रहे हैं, तो आप शब्दों 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"

दूसरे शब्दों self::में, स्थिर संपत्ति को संदर्भित करता है और उसी दायरे से स्थिर होता है जहां इसे बुलाया जा रहा है (इस मामले में Personसुपरक्लास), जबकि static::संपत्ति और निरंतर समय में गुंजाइश से संपत्ति तक पहुंच जाएगी (इसलिए इस मामले में)Pirate उपवर्ग )।

आगे पढ़ें स्थैतिक बाइंडिंग यहाँ php.net पर
एक अन्य प्रश्न के उत्तर की जाँच यहाँ और यहाँ भी करें


4

एक वर्ग विधि या संपत्ति को स्थैतिक घोषित करने से वर्ग की तात्कालिकता की आवश्यकता के बिना उन्हें सुलभ बनाया जा सकता है।

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

निजी, सार्वजनिक और संरक्षित एक्सेस मॉडिफायर हैं जो बताते हैं कि कौन पैरामीटर / विधि का उपयोग कर सकता है।

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


2

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

परिभाषा

जैसा कि नाम का कहना है कि एक स्थिर चर के मूल्यों को बदला नहीं जा सकता है। संयोजक सामान्य चर से भिन्न होते हैं कि आप $ प्रतीक का उपयोग उन्हें घोषित करने या उपयोग करने के लिए नहीं करते हैं।

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

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

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

?>

स्थिर

परिभाषा

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

नोट: छद्म-चर $ यह स्थिर के रूप में घोषित विधि के अंदर उपलब्ध नहीं है। तीर संचालक का उपयोग करके वस्तु के माध्यम से भौतिक गुणों तक पहुँचा नहीं जा सकता है ->

PHP 5.3.0 के रूप में, एक चर का उपयोग करके वर्ग को संदर्भित करना संभव है। > चर का मान कोई कीवर्ड नहीं हो सकता (जैसे स्वयं, माता-पिता और स्थैतिक)।

स्थिर संपत्ति उदाहरण

<?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";

 ?>

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

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

लिंक 1 विकिपीडिया

ट्यूटोरियल एनकैप्सुलेशन के बारे में लिंक को इंगित करते हैं

परिभाषा

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

उदाहरण

 <?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 डॉक्टर के बारे में अधिक जानकारी के लिए इस php प्रलेखन को पढ़ें

संदर्भ: php.net

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


2

तो @ महान जवाब पर फिर से बनाने के लिए:

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

  • यदि आपको आवश्यक संपत्ति को बदलने की अनुमति है, तो इसके बजाय स्थैतिक का उपयोग करें

उदाहरण:

class User{
    private static $PASSWORD_SALT = "ASD!@~#asd1";
    ...
}

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

संपादित करें: यह ध्यान रखना महत्वपूर्ण है कि PHP 7.1.0 ने कक्षा में रहने वाले लोगों की दृश्यता को निर्दिष्ट करने के लिए समर्थन पेश किया

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.