পিএইচপি 5: স্থিতিশীল বনাম কনস


167

পিএইচপি 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 :: $ ভেরিয়েবলের মাধ্যমে যে কোনও জায়গায় অ্যাক্সেস করা যায়।
  • সুরক্ষিত স্ট্যাটিক ভেরিয়েবলগুলি ক্লাসনেম :: $ ভেরিয়েবলের মাধ্যমে সংজ্ঞায়িত শ্রেণি বা সম্প্রসারিত শ্রেণি দ্বারা অ্যাক্সেস করা যায়।
  • প্রাইভেট স্ট্যাটিক ভেরিয়েবলগুলি কেবল ক্লাসনেম :: $ ভেরিয়েবলের মাধ্যমে সংজ্ঞায়িত শ্রেণী দ্বারা অ্যাক্সেস করা যায়।

সম্পাদনা করুন: এটি লক্ষ করা জরুরী যে পিএইচপি 7.1.0 শ্রেণিবদ্ধদের দৃশ্যমানতা নির্দিষ্ট করার জন্য সমর্থন প্রবর্তন করেছিল


27
আমি self::$variableসুরক্ষিত স্ট্যাটিক এবং প্রাইভেট স্ট্যাটিক ভেরিয়েবলগুলির জন্য ব্যবহার করতে পছন্দ করি কারণ আমি ক্লাসের নামটি কেবল একবার নিজের মধ্যে বর্ণিত রাখতে পছন্দ করি যা ক্লাসের একেবারে শুরুতে।
লুকমান

3
হ্যাঁ, ভালো কথা, আমি উল্লেখ করতে অবহেলা করেছি যে ক্লাসের মধ্যে থেকেই রেফারেন্স দিলে স্ব কীওয়ার্ডটি ব্যবহার করা যেতে পারে। আমি উপরে প্রদত্ত উদাহরণগুলি ক্লাস সংজ্ঞার বাইরে সম্পাদিত হয়েছিল, সেক্ষেত্রে শ্রেণীর নামটি অবশ্যই ব্যবহার করা উচিত।
ম্যাট হাগিনস

দুর্দান্ত উত্তর, গ্রহণের খুব কাছাকাছি। আপনি কি দয়া করে একটি বিষয় পরিষ্কার করতে পারেন: "সরকারী, সুরক্ষিত এবং ব্যক্তিগত কনস্টেটগুলির ক্ষেত্রে অপ্রাসঙ্গিক" - কেন? ডিফল্টভাবে কনসেন্টগুলি কি সর্বজনীন? সব প্রাইভেট?
ক্রিস জ্যাকব

1
একটি স্ট্যাটিক ভার একটি প্রয়োজন হয় না $? static $my_var = 10;সংজ্ঞায়
ড্যানিয়েল ডাব্লু।

পুরানো থ্রেড, তবে আমি কিছু যুক্ত করতে চাই: php.net/manual/en/… দেখুন , যা staticভেরিয়েবলগুলি সিঙ্গেলন এবং পুনরাবৃত্ত ফাংশনেও খুব দরকারী explains কারণ আপনি মানটি পরিবর্তন করতে পারেন তবে পরিবর্তনশীল কেবল একবারই শুরু করা হবে। কীভাবে একটি সিঙ্গলটন তৈরি করবেন তার আরও তথ্যের জন্য stackoverflow.com/questions/203336/… দেখুন । আমার জন্য সেগুলি এমন কিছু পরিস্থিতি যেখানে আমি স্থির পরিবর্তনশীলকে পছন্দ করি।
এরিক ভ্যান ডি ভেন

20

একটি শেষ পয়েন্ট যা করা উচিত তা হ'ল একটি কনস্ট সবসময় স্থির এবং সর্বজনীন। এর অর্থ আপনি বর্গের মধ্যে থেকে কনস্টিকে অ্যাক্সেস করতে পারবেন:

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

শ্রেণীর বাইরে থেকে আপনি এটি এতে অ্যাক্সেস করতে পারবেন:

echo MyClass::MYCONST;

1
এই ঘোষণা কি সত্য? "কনস্ট্যান্ট সবসময় স্থির এবং প্রকাশ্য"?
apil.tamang

7
এটি আর সত্য নয়। পিএইচপি হিসাবে 7.1 ক্লাস কনস্ট্যান্টগুলি ব্যক্তিগত বা সুরক্ষিত হিসাবে ঘোষণা করা যেতে পারে। আরএফসি
অসন্তুষ্টগোট

11

স্থায়ী শুধু একটি ধ্রুবক, IE আপনি ঘোষণা পর এর মান পরিবর্তন করতে পারবেন না।

স্ট্যাটিক ভেরিয়েবল কোনও শ্রেণীর উদাহরণ তৈরি না করেই অ্যাক্সেসযোগ্য এবং তাই শ্রেণীর সমস্ত দৃষ্টান্তের মধ্যে ভাগ করা যায়।

এছাড়াও, কোনও ফাংশনে স্থিতিশীল স্থানীয় পরিবর্তনশীল থাকতে পারে যা কেবল একবার ঘোষিত হয় (কোনও ফাংশন প্রথম প্রয়োগের সময়) এবং ফাংশন কলগুলির মধ্যে এর মান সংরক্ষণ করতে পারে, উদাহরণস্বরূপ:

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সাবক্লাসে এই ক্ষেত্রে )।

এখানে পিএইচপিএনটিমে দেরীতে স্থির বাইন্ডিং সম্পর্কে আরও পড়ুন ।
এছাড়াও এখানে এবং এখানে অন্য প্রশ্নের উত্তর পরীক্ষা করে দেখুন ।


4

কোনও শ্রেণি পদ্ধতি বা সম্পত্তি স্থিতিশীল হিসাবে ঘোষণা করা তাদের ক্লাসের ইনস্ট্যানটিশনের প্রয়োজন ছাড়াই অ্যাক্সেসযোগ্য করে তোলে।

একটি শ্রেণির ধ্রুবক হ'ল সাধারণ ধ্রুবকের মতো, রানটাইমে এটি পরিবর্তন করা যায় না। আপনি কখনও কখনও কনস্ট ব্যবহার করবেন না এটিই একমাত্র কারণ।

ব্যক্তিগত, সর্বজনীন এবং সুরক্ষিত হ'ল অ্যাক্সেস মডিফায়ারগুলি যা বর্ণনা করে যে কোন প্যারামিটার / পদ্ধতিতে কারা অ্যাক্সেস করতে পারে।

সর্বজনীন মানে অন্যান্য সমস্ত বস্তু অ্যাক্সেস পায়। ব্যক্তিগত অর্থ হ'ল কেবল তাত্ক্ষণিক শ্রেণি অ্যাক্সেস পায়। সুরক্ষিত অর্থ হ'ল তাত্ক্ষণিক শ্রেণি এবং উত্পন্ন ক্লাসগুলি অ্যাক্সেস পায়।


2

স্থির সদস্য, ধ্রুবক ভেরিয়েবল এবং অ্যাক্সেস মডিফায়ার (ব্যক্তিগত, সর্বজনীন এবং সুরক্ষিত) সম্পর্কে আমি এতক্ষণ যা শিখেছি তা এখানে। ধ্রুব

সংজ্ঞা

নামটির মতো ধ্রুবক ভেরিয়েবলের মানগুলি পরিবর্তন করা যায় না on কনস্ট্যান্টসগুলি সাধারণ ভেরিয়েবলের থেকে পৃথক যে আপনি declare চিহ্নটি তাদের ঘোষণা বা ব্যবহার করার জন্য ব্যবহার করেন না।

মানটি অবশ্যই একটি ধ্রুবক প্রকাশ হতে পারে (উদাহরণস্বরূপ) কোনও পরিবর্তনক, সম্পত্তি, গাণিতিক ক্রিয়াকলাপের ফলাফল বা কোনও ফাংশন কল নয়।

দ্রষ্টব্য: ভেরিয়েবলের মান কোনও মূলশব্দ হতে পারে না (উদাঃ স্ব, পিতা বা মাতা এবং স্থির)।

পিএইচপি-তে একটি ধ্রুবক ঘোষণা করা

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

?>

স্থির

সংজ্ঞা

স্ট্যাটিক কীওয়ার্ডটি ক্লাস, মেম্বার ফাংশন বা ভেরিয়েবল ঘোষণার জন্য ব্যবহার করা যেতে পারে a ক্লাসে স্ট্যাটিক সদস্যরা স্ব-কীওয়ার্ড ব্যবহার করেও অ্যাক্সেস করতে পারবেন class শ্রেণীর বৈশিষ্ট্য বা পদ্ধতিগুলি স্ট্যাটিক হিসাবে বর্ণনা করে তাদের ক্লাসের ইনস্ট্যানটিশনের প্রয়োজন ছাড়াই অ্যাক্সেসযোগ্য করে তোলে । স্থির হিসাবে ঘোষিত একটি সম্পত্তি তাত্ক্ষণিক শ্রেণীর অবজেক্টের সাথে অ্যাক্সেস করা যায় না (যদিও স্থির পদ্ধতিটি পারে)। যদি কোনও দৃশ্যমানতার ঘোষণাপত্র (জনসাধারণ, ব্যক্তিগত, সুরক্ষিত) ব্যবহার না করা হয়, তবে সম্পত্তি বা পদ্ধতিটিকে জনসাধারণ হিসাবে ঘোষিত বলে গণ্য করা হবে ause কারণ স্থির পদ্ধতিগুলি তৈরি করা অবজেক্টের উদাহরণ ছাড়াই কলযোগ্য।

দ্রষ্টব্য: সিউডো-ভেরিয়েবল stat এটি স্ট্যাটিক হিসাবে ঘোষিত পদ্ধতির অভ্যন্তরে উপলব্ধ নয় the তীর অপারেটর ব্যবহার করে বস্তুর মাধ্যমে স্ট্যাটিক বৈশিষ্ট্য অ্যাক্সেস করা যাবে না ->

পিএইচপি 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";

 ?>

সরকারী, ব্যক্তিগত, সুরক্ষিত (একে একে অ্যাক্সেস মডিফায়ার)

নীচের সংজ্ঞাটি পড়ার আগে, এনক্যাপসুলেশন সম্পর্কে এই নিবন্ধটি পড়ুন। এটি আপনাকে ধারণাটি আরও গভীরভাবে বুঝতে সাহায্য করবে

লিঙ্ক 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.net

আমি আশা করি আপনি ধারণাটি বুঝতে পেরেছেন। পড়ার জন্য ধন্যবাদ :) :) একটি ভাল আছে


2

সুতরাং @ ম্যাট দুর্দান্ত উত্তরটি পুনরুদ্ধার করতে:

  • আপনার প্রয়োজনীয় সম্পত্তিটি পরিবর্তন করা উচিত নয়, তবে একটি ধ্রুবক যথাযথ পছন্দ

  • যদি আপনার প্রয়োজনীয় সম্পত্তিটি পরিবর্তন করার অনুমতি দেওয়া হয় তবে তার পরিবর্তে স্থির ব্যবহার করুন

উদাহরণ:

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

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

সম্পাদনা করুন: এটি লক্ষ করা জরুরী যে পিএইচপি 7.1.0 শ্রেণিবদ্ধদের দৃশ্যমানতা নির্দিষ্ট করার জন্য সমর্থন প্রবর্তন করেছিল

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.