PHP 5: const vs static


Відповіді:


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 можна використовувати, якщо посилатися з самого класу. Наведені вище приклади виконувались поза визначенням класу, і в цьому випадку слід використовувати назву класу.
Мет Хаггінс

Чудова відповідь, дуже близька до прийняття. Чи можете ви уточнити один момент: "Громадські, захищені та приватні не мають значення з точки зору конкурсів" - Чому? Чи є consts за замовчуванням усіма публічними? все приватне?
Кріс Якоб

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
НезадоволенняGoat

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

Ось що я дізнався досі про статичні члени, постійні змінні та модифікатори доступу (приватні, загальнодоступні та захищені). Постійний

Визначення

Як і в імені, значення константної змінної не можна змінити. Константи відрізняються від звичайних змінних тим, що ви не використовуєте символ $ для їх оголошення або використання.

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

Примітка. Значення змінної не може бути ключовим словом (наприклад, власна, батьківська та статична).

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

?>

Статичний

Визначення

Статичне ключове слово можна використовувати для оголошення класу, функції члена або змінної. До статичних членів у класі є глобальним, можна отримати доступ і за допомогою власного ключового слова. Визначення властивостей класу або методів як статичних робить їх доступними без необхідності присвоєння класу . Властивість, оголошена статичною, не може бути доступна з об'єктом миттєвого класу (хоча статичний метод може). Якщо не використовується декларація видимості (загальнодоступна, приватна, захищена), то властивість або метод розглядаються так, як ніби вони були оголошені як загальнодоступні. Тому що статичні методи можна викликати без екземпляра створеного об'єкта.

Примітка: псевдо-змінна $ це недоступно всередині методу, оголошеного статичним. Статистичні властивості не можна отримати через об'єкт за допомогою оператора стрілки ->

Станом на 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)

  ?>

Для отримання додаткової інформації прочитайте цю документацію про видимість Visibility 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.