Відповіді:
У контексті класу статичні змінні знаходяться в області класу (не об'єкта), але на відміну від 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.
Громадські, захищені та приватні не мають значення з точки зору конкурентоспроможності (які завжди є публічними); вони корисні лише для змінних класів, включаючи статичну змінну.
Редагувати: Важливо зазначити, що PHP 7.1.0 представив підтримку для визначення видимості констант класу .
$
? static $my_var = 10;
у визначенні
static
змінні дуже корисні в одиночних кнопках та рекурсивних функціях. Оскільки ви МОЖЕТЕ змінити значення, але змінна буде ініціалізована лише один раз. Дивіться stackoverflow.com/questions/203336/… для подальшого пояснення, як створити одиночну кнопку. Для мене це деякі ситуації, в яких я віддаю перевагу статичним змінним.
Останнє, що слід зробити, - це те, що const завжди є статичним та відкритим. Це означає, що ви можете отримати доступ до 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");
}
Якщо говорити про успадкування класу, ви можете розрізняти константи або змінну в різних сферах, використовуючи 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 .
Також перевірте відповідь на інше питання тут і тут .
Оголошення методу чи властивості класу статичними робить їх доступними, не потребуючи примірників класу.
Константа класу подібна до звичайної константи, вона не може бути змінена під час виконання. Це також єдина причина, за яку ви коли-небудь будете використовувати const.
Приватний, загальнодоступний і захищений - це модифікатори доступу, які описують, хто може отримати доступ до якого параметра / методу.
Публічний означає, що всі інші об’єкти отримують доступ. Приватне означає, що доступ отримує лише інстанційований клас. Захищений означає, що доступ до класів з інстанційними та похідними класами отримує доступ.
Ось що я дізнався досі про статичні члени, постійні змінні та модифікатори доступу (приватні, загальнодоступні та захищені). Постійний
Визначення
Як і в імені, значення константної змінної не можна змінити. Константи відрізняються від звичайних змінних тим, що ви не використовуєте символ $ для їх оголошення або використання.
Значення повинно бути постійним виразом, а не (наприклад) змінною, властивістю, результатом математичної операції або викликом функції.
Примітка. Значення змінної не може бути ключовим словом (наприклад, власна, батьківська та статична).
Оголошення константи в 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)
Перш ніж прочитати визначення нижче, прочитайте цю статтю про інкапсуляцію. Це допоможе вам глибше зрозуміти поняття
Підручники вказують на інкапсуляцію
Визначення
Використовуючи приватні, загальнодоступні, захищені ключові слова, ви можете контролювати доступ до членів класу. Учасники класу, оголошені громадськістю, можуть бути доступні всюди. Доступ до учасників, оголошених захищеними, може бути доступний лише у самому класі та у спадок та батьківські класи. Члени, оголошені приватними, мають доступ лише до класу, який визначає члена.
Приклад
<?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
Сподіваюся, ви зрозуміли концепцію. Дякуємо за прочитане :) :) Приємного
Тож, щоб скласти резюме на чудовій відповіді на @Matt:
якщо властивість, яка вам потрібна, не повинна змінюватися, то постійним є правильний вибір
якщо потрібне вам властивість дозволено змінити, використовуйте замість нього статичну
Приклад:
class User{
private static $PASSWORD_SALT = "ASD!@~#asd1";
...
}
class Product{
const INTEREST = 0.10;
...
}
Редагувати: Важливо зазначити, що PHP 7.1.0 представив підтримку для визначення видимості констант класу .
self::$variable
захищені статичні та приватні статичні змінні, оскільки я вважаю за краще, щоб ім’я класу було згадане лише один раз у собі, що знаходиться на самому початку класу.