Czym są stałe?
Stałe są to nazwy, które identyfikują jakieś proste wartości. Jak nazwa wskazuje, nie mogą się one zmieniać w trakcie wykonywania skryptu. PHP domyślnie rozróżnia w nazwach stałych wielkość liter. Zgodnie z ogólnie przyjętymi zasadami, nazwy stałych piszemy wielkimi literami.
Poprawna nazwa stałej zaczyna się od litery lub podkreślenia, po których następuje dowolna ilość liter, cyfr i podkreślników.
Przykład:
<?php
_STALA;
WIELKI_DUZY_JEZ;
Zasięg stałych
Każda stała będzie posiadała domyślnie zasięg globalny. Oznacza to, że jak zdefiniujemy stałą na początku skryptu, to będzie ona dostępna we wszystkich skryptach, które wczytujemy. Obecnie w PHP programiści wolą stosować stałe w klasach, gdyż jest to rozwiązanie bardziej bezpieczne dla aplikacji.
Jak definiujemy stałe?
Jest to bardzo proste i intuicyjne. Do definiowania stałych służy polecenie define(const Name, const Value)
W PHP7 możemy definiować także tablicę jako stałą. (Uwaga! Taka tablica powinna być tego samego typu)
Działanie define zademonstrujemy na poniższym przykładzie:
<?php
define("CONSTANT", "Hello world.");
echo CONSTANT; // outputs "Hello world."
echo Constant; // outputs "Constant" and issues a notice.
define("GREETING", "Hello you.", true);
echo GREETING; // outputs "Hello you."
echo Greeting; // outputs "Hello you."
// Works as of PHP 7
define('ANIMALS',[
'dog',
'cat',
'bird'
]);
echo ANIMALS[1]; // outputs "cat"
Link do przykładu: https://3v4l.org/HOINP
Predefiniowane stałe
Są to stałe pochodzące prosto z samego silnika PHP. Nie wszystkie warto znać, dlatego pokażemy najważniejsze z nich, które czasami uratują Twoj projekt.. Więcej informacji o predefiniowanych stałych znajdziesz tutaj: PHP Manual - Core Constants
PHP_VERSION
Aktualna wersja PHP jako ciąg znaków. np 7.0.3-zts.PHP_VERSION_ID
Wersja PHP przedstawiona jako liczba całkowita np. 70003.PHP_OS
Zwraca nazwę systemu operacyjnego na którym uruchomione jest PHP.PHP_EOL
Ważna stała wypada ją zapamiętać. Zwraca ona znaki końca nowej linii zależne od systemu na którym PHP jest uruchomiony.PHP_INT_MAX
Maksymalna wartość dla typu IntegerPHP_INT_MIN
Minimalna wartość dla typu IntegerDIRECTORY_SEPARATOR
Warto znać. Zwraca separator przejścia do następnego katalogu. Windows \ , linux /
Magiczne stałe
To w zasadzie nie są stałe, gdyż ich wartość zmienia się w trakcie trwania skryptu. Nie możemy ich nadpisać, możemy je jedynie odczytać. Czasami można je wykorzystać do bardziej "swojego" sposobu wyświetlania błędów. Ale nie zapominajmy, że na produkcji błędy nie mają prawa się ujawnić. Mają trafić do logów! Co zawierają w sobie takie Magiczne stałe?
__LINE__
Zwraca aktualna linię wykonywanego skryptu__FILE__
Zwraca ścieżkę bezwzględną wraz z rozwiązanymi dowiązaniami symbolicznymi. Jeżeli użyta wewnątrz dołączonego pliku, zwraca jego nazwę.__DIR__
Nazwa katalogu w którym skrypt jest wykonywany. Odpowiada dirname(FILE). Zwracana nazwa nie zawiera końcowego ukośnika, chyba że jest to katalog root.__FUNCTION__
Nazwa aktualnie wykonywanej funkcji__CLASS__
Nazwa klasy wraz z przestrzenią nazw.__TRAIT__
Nazwa dołączonego do klasy traita włącznie z przestrzenią nazw.__METHOD__
Metoda klasy__NAMESPACE__
Nazwa aktualnej przestrzeni nazw.
Stałe w klasach
Jest to najczęściej stosowana metoda, ponieważ określa ona zasięg stałych. Obecnie stałe w klasach posiadają widoczność na "public" jednakże może się to niebawem zmienić. Poniżej prezentujemy przykład jak zdefiniować taka stałą.
<?php
namespace Bar;
class Foo
{
const FOO_NAME = "FOO:BAR";
const VERSION = "1.3.4";
}
Tworzymy sobie klasę Foo, która zawiera dwie stałe. FOO_NAME
VERSION
do tych stałych odwołujemy się tak: \Bar\Foo::FOO_NAME
Proste, prawda? Oczywiście \Bar\
to odwołanie sie do konkretnej przestrzeni nazw!
"define()" vs "const"
Zapewne zastanawiałeś się jaka jest różnica pomiędzy define()
a const
otóż:
define()
umożliwia definiowanie stałych w trakcie wykonywania skryptu, podczas gdyconst
definiuje stałe w czasie kompilacji. To dajeconst
nieco większą przewagę w prędkości.define()
"wsadza" wszystkie zdefiniowane stałe do globalnej przestrzeni (global scope) więc łatwo się domyślić, że nie można go stosować w klasach oraz w przestrzeniach nazw. Zobacz ten przykład https://3v4l.org/DKYAIdefine()
może być użyty w blokuif( ) { }
, aconst
nie.
Kiedy używać?
Musisz sam to rozważyć. Obecnie w PHP bardziej idzie się w stronę const
gdyż jest ono wygodniejsze, szybsze i przede wszystkim BEZPIECZNIEJSZE...
Zobacz poniższy przykład:
<?php
namespace PHPKurs\Constants\Fruits{
const APPLE = "Jabuszko";
const BANANA = "Banan";
}
namespace PHPKurs\Constants\Animals{
const DOG = "pies";
const CAT = "kot";
const DUCK = "Kaczuszka";
const PIG = "Świnka";
}
namespace {
echo \PHPKurs\Constants\Fruits\APPLE;
echo " & ";
echo \PHPKurs\Constants\Animals\PIG;
}
Stałe są w przeznaczonych do tego przestrzeniach nazw i nic nie wypływa do "global scope". Albo robimy pizzę składającą sie z kilku warstw, albo spaghetti! :> Więcej informacji znajdziesz pod tym linkiem: "Define vs Const stackoverflow".