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

В PHP 5, в чем разница между использованием const и static?

Когда каждый уместен? И какую роль играют public, protected и private - если таковая имеется?

Ответ 1

В контексте класса статические переменные находятся в области видимости класса (не объекта), но в отличие от 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 представил поддержку для определения видимости констант класса.

Ответ 2

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

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

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

echo MyClass::MYCONST;

Ответ 3

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

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

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

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

Ответ 4

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

Ответ 5

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

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

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

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

Ответ 6

Напомним, @Matt отличный ответ:

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

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

Пример:

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

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

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

Ответ 7

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

Определение

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

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

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

Объявление константы в 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

Определение

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

 ?>

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

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

Ссылка 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 о видимости Видимость Php Doc

Ссылки: php.net

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