PHP 5: постоянный против статического


Ответы:


187

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

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
Да, хорошо, я не упомянул, что ключевое слово self может использоваться при обращении из самого класса. Приведенные выше примеры были выполнены вне определения класса, и в этом случае необходимо использовать имя класса.
Мэтт Хаггинс

Отличный ответ, очень близко к принятию. Не могли бы вы уточнить один момент: «Публичный, защищенный и частный не имеют значения с точки зрения констант» - Почему? Являются ли conts по умолчанию общедоступными? все личное?
Крис Джейкоб

1
статическая переменная не нужна $? static $my_var = 10;в определении
Даниэль В.

Старый поток, но я хотел бы кое-что добавить: посмотрите php.net/manual/en/… , который объясняет, что staticпеременные очень полезны в одиночных и рекурсивных функциях. Потому что вы МОЖЕТЕ изменить значение, но переменная будет инициализирована только один раз. См. Stackoverflow.com/questions/203336/… для дальнейшего объяснения, как создать синглтон. Для меня это те ситуации, в которых я предпочитаю статические переменные.
Эрик ван де Вен

20

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

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

За пределами класса вы можете получить к нему доступ так:

echo MyClass::MYCONST;

1
это заявление правда? что "const всегда статичен и публичен"?
apil.tamang

7
Это больше не правда. Начиная с PHP 7.1 константы класса могут быть объявлены как частные или защищенные. Смотрите RFC
DisgruntledGoat

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

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

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

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

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


2

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

Определение

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

Значение должно быть константным выражением, а не (например) переменной, свойством, результатом математической операции или вызовом функции.

Примечание: значение переменной не может быть ключевым словом (например, self, parent и static).

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

<?php
class constantExample{

   const CONSTANT = 'constant value'; //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 может использоваться для объявления класса, функции-члена или переменной. Доступ к статическим членам класса является глобальным, а также с помощью ключевого слова self. Объявление свойств или методов класса как статических делает их доступными без необходимости создания экземпляра класса , Свойство, объявленное как статическое, не может быть доступно с экземпляром объекта класса (хотя статический метод может). Если не используется объявление видимости (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 википедия

Учебники указывают ссылку на инкапсуляцию

Определение

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

пример

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

Рекомендации: php.net

Я надеюсь, что вы поняли концепцию. Спасибо за чтение :) :) Хорошего вам


2

Итак, резюмируем @Matt отличный ответ:

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

  • если нужное свойство может быть изменено, используйте вместо него статический

Пример:

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

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

Изменить: Важно отметить, что PHP 7.1.0 представил поддержку для определения видимости констант класса .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.