PHP5: const vs static

В PHP5, в чем разница между использованием const и static ? Когда каждый из них подходит? И какую роль играет public , protected и private игра – если таковая имеется.

    В контексте класса статические переменные относятся к области видимости класса (а не к объекту), но в отличие от константы их значения могут быть изменены.

     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 :: $.
    • защищенные статические переменные могут быть доступны определяющим классом или расширенными классами через переменную ClassName :: $.
    • к частным статическим переменным может обращаться только определяющий класс через переменную ClassName :: $.

    Последний момент, который нужно сделать, это то, что константа всегда статична и общедоступна. Это означает, что вы можете получить доступ к const из класса, например:

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

    Извне класса вы получите доступ к нему следующим образом:

     echo MyClass::MYCONST; 

    Константа – это просто константа, то есть вы не можете изменить ее значение после объявления.

    Статическая переменная доступна без создания экземпляра класса и поэтому распределяется между всеми экземплярами класса.

    Кроме того, в функции, которая объявляется только один раз (при первом выполнении функции), может быть статическая локальная переменная и может сохранять ее значение между вызовами функций, например:

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

    Объявление метода или свойства класса как статичного делает их доступными без необходимости создания экземпляра класса.

    Константа класса похожа на нормальную константу, ее нельзя изменить во время выполнения. Это также единственная причина, по которой вы когда-либо будете использовать const.

    Частные, общедоступные и защищенные – это модификаторы доступа, которые описывают, кто может получить доступ к этому параметру / методу.

    Общественность означает, что все другие объекты получают доступ. Частный означает, что доступ только к экземпляру класса. Защищенный означает, что доступ к экземпляру класса и производных классов получает доступ.

    Итак, чтобы напомнить @Matt отличный ответ:

    • в большинстве ситуаций вам понадобится свойство Private / Protected Static, поэтому константы не являются опцией.

    • если требуемое свойство должно быть общедоступным, но не изменено, константа является правильным выбором.

    Пример:

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

    Говоря о наследовании классов, вы можете различать константу или переменную в разных областях с помощью 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, parent и static).

    Объявление константы в php

     <?php class constantExample{ const CONSTANT = 'constant value'; //constant } ?> 

    Область Constant является глобальной и может быть доступна с использованием ключевого слова self

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

    статический

    Определение

    Ключевое слово Static можно использовать для объявления класса, функции-члена или переменной. Элементы-члены в классе глобальны также могут быть доступны с использованием собственного ключевого слова. Определение свойств класса или методов как статических делает их доступными без необходимости создания экземпляра класса , Свойство, объявленное как статическое, не может быть доступно с помощью экземпляра объекта класса (хотя может использоваться статический метод). Если не используется декларация видимости (public, private, protected), то свойство или метод будут обрабатываться так, как если бы он был объявлен как public. Поскольку статические методы могут быть вызваны без экземпляра созданного объекта.

    Примечание: псевдопеременная $ this недоступна внутри метода, объявленного как static.Static свойства не могут быть доступны через объект с помощью оператора стрелки ->

    Начиная с PHP 5.3.0, можно ссылаться на класс, используя переменную. Значение переменной не может быть ключевым словом (например, self, parent и 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"; ?> 

    Открытый, закрытый, защищенный (модификаторы доступа AKA)

    Прежде чем читать определение ниже, прочитайте эту статью об инкапсуляции. Это поможет вам глубже понять концепцию

    Ссылка 1 wikipedia

    Ссылка на учебники по инкапсуляции

    Определение

    Используя закрытые, общедоступные, защищенные ключевые слова, вы можете контролировать доступ к членам класса. К членам класса, объявленным публичными, можно получить доступ во всех странах. Доступ к элементам, объявленным защищенными, может быть доступен только внутри самого класса и наследуемых и родительских классов. Участникам, объявленным как private, может быть доступен только класс, определяющий участника.

    пример

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

    Надеюсь, вы поняли концепцию. Спасибо за чтение 🙂 🙂 Хороший