Наслідування та видимість в PHP
Область видимості, в PHP, змінної – це контекст, у якому ця змінна визначена, область видимості охоплює також файли, що включаються (include) і (require).
Беріть карвалол, або покуріть і лише після цього посинайте читати далі.
$a = 1; // Видно в усьому документі крім тіла функцій та класів
function test()
{
$b= 4; // змінну видно тільки у функції test
echo $a; // змінну "а" не видно тому що вона за межами функції
}
function test2()
{
global: a;
echo $a; // тепер змінна "а" = 1.
}
function test3($a) - // Можна передати глобальну змінну в середену функції через її тіло
{
echo $a; // тепер змінна "а" = 1.
}
Є лише один спосіб заставити змінну стати СУПЕРГЛОБАЛЬНОЮ - бути видною усюди, прописавши глобальність лише 1 раз: це використання спеціального PHP масиву $GLOBALS.
$a = 1;
$b = 2;
function Sum()
{
$GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b']; //тепер видно в середині функції або метода класу.
}
В будь-якій точці також видно такі суперглобальні змінні:
- $_SERVER
- $_GET
- $_POST
- $_SESSION
- $_COOKIE
- $_FILES
- $_ENV
- $_REQUEST
Статичні змінні.
function foo() {
static $int = 1; // вірно
static $int = 1+2; // вірно
static $int = sqrt(121); // невірно (так як це функція)
$int++;
echo $int; // змінна $int ЗАВЖДИ = 1 - так як вона статична і не може міняти свого значення яке призначили перший раз.
}
Статичним змінним можна присвоїти значення, що є результатом виразу, але не можна використовувати для цього функцію, так це викликає помилку аналізу. Починаючи з PHP 8.1.0, коли метод, що використовує статичні змінні, успадковується (але не перевизначається), успадкований метод тепер використовуватиме статичні змінні спільно з батьківським методом. Це означає, що статичні змінні в методах тепер поводяться так само, як і статичні властивості.
Якщо Ви дочитали до цього місця і Вам все зрозуміло по області видимості зміних - то тепер варто випити щось міцнішого бо тут без 100 гр. уже не розібратись.
Видимість в Класах PHP.
1. Наслідування.
Приклад 1.1 Якщо потрібно прочитати метод із батьківського класу + врахуємо видимість самих змінних:
$myVar = 6; // Даємо змінні - myVar- присвоюємо значення 6
$w = 5;
class A {
public function summ(){
$b = $GLOBALS['myVar']; // Читаємо глобальний масив $GLOBALS і дістаємо звідти зміну - myVar
$c = 4;
return $b+$c;
}
}
class B extends A {
public function twoSumm(){
global $w; // Робимо змінну - w - видимою у методі
$t = (new A())->summ(); // зчитуємо значення із батьківського метода
return $w + $t;
}
}
$x = new B; // Створюємо обєкт з класу - В
$z = $x->twoSumm(); // ДІстаємо значення методу - twoSumm
echo $z; // Спробуйте підрахувати суму самі - відповідь під цим блоком