Php глобальні константи. Константи у PHP. Як мені використовувати внутрішні чи глобальні класи у просторі імен

(PHP 5> = 5.3.0, PHP 7)

Цей перелік питань розділений на дві частини: загальні питання та деякі особливості реалізації, які є корисними для більш повного розуміння.

Спершу, спільні питання.

  1. Якщо я не використовую простору імен, чи слід вважати щось із цього важливим?
  2. Як мені використовувати внутрішні чи глобальні класи у просторі імен?
  3. Як мені використовувати функції класів у просторах імен, чи константи у їхньому власному просторі імен?
  4. Як таке ім'я як \my\nameабо \nameперетворюється?
  5. Як таке ім'я, як my\nameперетворюється?
  6. Як неповне ім'я класу таке як nameперетворюється?
  7. Як неповне ім'я функції або неповне ім'я константи таке як nameперетворюється?

Деякі деталі реалізації просторів імен, які корисно розуміти.

  1. Імпортовані імена не можуть конфліктувати з класами, визначеними в файлі.
  2. Ні функції, ні константи не можуть бути імпортовані за допомогою оператора use.
  3. Динамічні імена просторів імен (ідентифікатори, взяті в лапки) повинні екранувати символ зворотного сліша.
  4. Посилатися на невизначені константи, використовуючи зворотний сліш, не можна. Виводиться фатальна помилка
  5. Неможливо перевизначити спеціальні константи, такі як NULL, TRUE, FALSE, ZEND_THREAD_SAFE або ZEND_DEBUG_BUILD

Якщо я не використовую простору імен, чи слід вважати щось із цього важливим?

Ні. Простір імен не впливає ні на який існуючий код ні в якому вигляді або на будь-який написаний код, який не містить просторів імен. Ви можете написати такий код, якщо бажаєте:

Приклад #1 Доступ до глобальних класів поза простором імен

$a = new\stdClass;
?>

Це функціонально еквівалентно наступному:

Приклад #2 Доступ до глобальних класів поза простором імен

$a = new stdClass;
?>

Як мені використовувати внутрішні чи глобальні класи у просторі імен?

Приклад #3 Доступ до внутрішніх класів у просторах імен

namespace foo;
$a = new\stdClass;

function test (\ ArrayObject $typehintexample = null ) ()

$a = \ DirectoryIterator :: CURRENT_AS_FILEINFO ;

// розширення внутрішнього чи глобального класу
class MyException extends \ Exception ()
?>

Як мені використовувати функції класів у просторах імен чи константи у їхньому власному просторі імен?

Приклад #4 Доступ до внутрішніх класів, функцій або константів у просторах імен

namespace foo;

class MyClass ()

// Використання класу з поточного простору імен
function test (MyClass $typehintexample = null ) ()
// інший спосіб використовувати клас із поточного простору імен
function test (\ foo \ MyClass $typehintexample = null ) ()

// Розширення класу з поточного простору імен
class Extended extends MyClass()

// Доступ до глобальної функції
$a = \globalfunc();

// Доступ до глобальної константи
$b = \INI_ALL;
?>

Як таке ім'я як \my\nameабо \nameперетворюється?

Імена, які починаються з \ завжди перетворюються до того як вони виглядають, тобто. \my\name- це насправді my\name, і \Exception- це Exception.

Приклад #5 Абсолютні імена

namespace foo;
$a = new \ my \ name (); // створює екземпляр класу "my\name"
echo\strlen ("hi"); // Викликає функцію "strlen"
$a = \INI_ALL; // змінною $a надається значення константи "INI_ALL"
?>

Як таке ім'я, як my\nameперетворюється?

Імена, які містять зворотний сліш, але не починаються з нього, такі як my\name

myіншого імені, то цей синонім застосовується до myв my\name.

my\name.

Приклад #6 Повні імена

namespace foo;
use blah\blah as foo;

$a = new my\name(); // створює екземпляр класу "foo\my\name"
foo\bar::name(); // викликає статичний метод "name" у класі "blah\blah\bar"
my\bar(); // викликає функцію "foo\my\bar"
$a = my\BAR; // надає змінній $a значення константи "foo\my\BAR"
?>

Як неповне ім'я класу таке як nameперетворюється?

Імена класів, які не містять зворотний сліш, такі як nameможуть бути перетворені двома різними способами.

Якщо є імпортуючий вираз, який створює синонім nameіншого імені, то застосовується цей синонім.

В іншому випадку, поточне ім'я простору імен стає префіксом до my\name.

Приклад #7 Неповні імена класів

namespace foo;
use blah\blah as foo;

$a = New name(); // створює екземпляр класу "foo\name"
foo :: name(); // викликає статичний метод "name" у класі "blah\blah"
?>

Як неповне ім'я функції або неповне ім'я константи таке як nameперетворюється?

Імена функцій або констант, які не містять зворотного слішу, такі як nameможуть бути перетворені двома різними способами.

Спершу, поточне ім'я простору імен стає префіксом до name.

Потім, якщо константа чи функція nameне існує у поточному просторі імен, використовується глобальна константа чи функція nameякщо вона існує.

Приклад #8 Неповні імена функцій або констант

namespace foo;
use blah\blah as foo;

const FOO = 1;

function my () ()
function foo () ()
function sort (& $a )
{
\ sort ($a); // Викликає глобальну функцію "sort"
$a = array_flip ($a);
return $a;
}

My(); // викликає "foo\my"
$a = strlen ("hi"); // викликає глобальну функцію "strlen", тому що "foo\strlen" не існує
$ arr = array (1, 3, 2);
$ b = sort ($ arr); // викликає функцію "foo\sort"
$ c = foo (); // викликає функцію "foo\foo" - імпорт не застосовується

$a = FOO; // надає змінній $a значення константи "foo\FOO" - імпорт не застосовується
$ b = INI_ALL; // надає змінної $b значення глобальної константи "INI_ALL"
?>

Імпортовані імена не можуть конфліктувати з класами, визначеними в файлі.

Наступні комбінації скриптів допустимі:

namespace my\stuff;
class MyClass ()
?>

namespace another ;
class thing ()
?>

namespace my\stuff;
include "file1.php";
include "another.php";


$a = new MyClass; // створює екземпляр класу "thing" із простору імен "another"
?>

Конфлікт імен відсутній навіть незважаючи на те, що клас MyClassіснує всередині простору імен my\stuff, тому що визначення MyClass знаходиться в окремому файлі. Однак наступний приклад призводить до фатальної помилки з конфліктом імен, тому що клас MyClass визначений у тому файлі, де знаходиться оператор use.

namespace my\stuff;
use another \ thing as MyClass ;
class MyClass () // Фатальна помилка: MyClass конфліктує з вираженням імпорту
$a = new MyClass;
?>

Вкладені простір імен неприпустимі.

PHP не дозволяє вкладення просторів імен одне в інше

namespace my\stuff (
namespace nested (
class foo ()
}
}
?>

Однак, зімітувати вкладені простори імен так:

namespace my\stuff\nested (
class foo ()
}
?>

До PHP 5.6 ні функції, ні константи не могли бути імпортовані оператором use.

До PHP 5.6 єдині елементи, які піддаються дії оператора use- це простору імен та імена класів. Щоб зменшити довгі імена констант або функцій, заімпортуйте їх вміст у простір імен.

namespace mine;
use ultra \ long \ ns \ name ;

$a = name \CONSTANT;
name \func();
?>

Починаючи з PHP 5.6 стало можливим імпортування та створення пседонімів для функцій та імен констант.

Динамічні імена просторів імен (ідентифікатори, взяті в лапки) повинні екранувати символ зворотного сліша.

Дуже важливо уявляти це, тому що зворотний сліш використовується як символ усередині рядків. Він завжди повинен бути продубльований, коли використовується всередині рядка, інакше виникає ризик виникнення ненавмисних наслідків:

Приклад #9 Підводне каміння при використанні імені простору імен усередині рядка з подвійними лапками

$a = "dangerous\name" ; // \n - це перехід на новий рядок усередині рядка з подвійними лапками!
$obj = new $a;

$a = "not\at\all\dangerous" ; // А тут немає проблем.
$obj = new $a;
?>

Усередині рядків, укладених в одинарні лапки, зворотний слєш як роздільник більш безпечний, але, як і раніше, рекомендована практика екранування зворотного слєша у всіх рядках є найкращим варіантом.

Посилатися на невизначені константи, використовуючи зворотний сліш, не можна. Виводиться фатальна помилка

Будь-яка невизначена константа, яка є неповним ім'ям, як FOO, буде приводити до висновку повідомлення про те, що PHP припустив, що FOOбуло значення константи. Будь-яка константа, з повним або абсолютним ім'ям, яка містить символ зворотного сліша, буде призводити до фатальної помилки, якщо не буде знайдена.

Приклад #10 Невизначені константи

namespace bar;
$a = FOO; // виводить попередження: undefined constants "FOO" assumed "FOO";
$a = \FOO; // фатальна помилка: undefined namespace constant FOO
$a = Bar \FOO; // фатальна помилка: undefined namespace constant bar\Bar\FOO
$a = \ Bar \ FOO; // фатальна помилка: undefined namespace constant Bar\FOO
?>

Неможливо перевизначити спеціальні константи, такі як NULL, TRUE, FALSE, ZEND_THREAD_SAFE або ZEND_DEBUG_BUILD

Будь-яка спроба визначити константу простору імен, яка збігається з назвами спеціальних вбудованих констант, призведе до фатальної помилки.

Приклад #11 Невизначені константи

namespace bar;
const NULL = 0; // Фатальна помилка;
const true = "stupid"; // також фатальна помилка;
// і т.д.
?>

7 років тому

Там є шлях, щоб визначити namespaced constant , що є особливим, побудовано-завжди, використовуючи визначену функцію і налаштування третій параметр case_insensitive to false:

namespace foo;
define (__NAMESPACE__ . "\NULL" , 10 ); // defines the constant NULL in the current namespace


?>

Не потрібно, щоб specify namespace в вашому телефоні(), як це happens usually
namespace foo;
define (INI_ALL, "bar"); // produces notice - Constant INI_ALL already defined. Але:

Define (__NAMESPACE__ . "\INI_ALL" , "bar" ); // defines the constant INI_ALL in the current namespace
var_dump (INI_ALL); // will show string(3) "bar". Ніякий невиявлений so far. Але:

Define ("NULL", 10); // defines the constant NULL in the current namespace...
var_dump (NULL); // will show 10
var_dump (null); // will show NULL
?>

Якщо параметр case_insensitive is set to true
namespace foo;
define (__NAMESPACE__ . "\NULL" , 10 , true ); // produces notice - Constant null already defined
?>

3 years ago

При створенні категорій або проведення статевих методів з namespaces використовуючи варіації, ви потрібні, щоб керувати в думці, що вони потребують повного namespace в порядку для відповідного класу для використання; Ви можете використовувати або шорсткий name, навіть якщо він називається з namespace. Незвільняючись до цього цього акаунта може викликати вашу коду для використання класу класу, запустити безглуздий дзвінок класу виведення, або заряджання або варення.

У цих випадках, ви можете використовувати magic constant __NAMESPACE__, або specify full namespace і class name directly. Функція class_exists також потребує повного namespace і class name, і може бути використана для забезпечення того, що fatal error won"t be thrown due to missing classes.

Namespace Foo;
class Bar (
public static function test () (
return get_called_class();
}
}

namespace Foo\Foo;
class Bar extends \ Foo \ Bar (
}

Var_dump(Bar::test()); // string(11) "Foo\Foo\Bar"

$bar = "Foo\Bar";
var_dump($bar::test()); // string(7) "Foo\Bar"

$bar = __NAMESPACE__ . "\Bar";
var_dump($bar::test()); // string(11) "Foo\Foo\Bar"

$bar = "Bar";
var_dump($bar::test()); // FATAL ERROR: Class "Bar" не з'являється або Incorrect class \Bar used

Зустрічаються випадки, коли змінні досить незручно використовуватиме постійного зберігання якихось певних значень, які змінюються протягом роботи програми. Такими значеннями можуть бути математичні константи, шляхи до файлів, різноманітні паролі тощо. Саме для цих цілей у PHP передбачена така конструкція, як.

називається іменована величина, яка не змінюється у процесі виконання програми (скрипта).

У РНР константи визначаються функцією define(). Ця функція має такий формат:

define ($name, $value, $case_sen), де:

$name- Ім'я константи;
$value- Значення константи;
$case_sen- необов'язковий параметр логічного типу,
вказує, чи слід враховувати регістр літер (true) чи ні (false).

Приклад визначення та використання констант у PHP:


echo pi;
// Виводить 3.14
?>

Якщо параметр $case_senдорівнює true, то інтерпретатор враховуватиме регістр символів під час роботи з константою. Зверніть увагу, що константи використовуються без попереднього знаку $ .

Відмінності між константами та змінними:

    Констант не має приставки у вигляді знака долара ( $ );

    Константи можна визначити лише за допомогою функції define(), а чи не привласненням значення;

    Константи можуть бути визначені та доступні в будь-якому місці без урахування області видимості;

    Константи не можуть бути визначені або анульовані після первинного оголошення;

    Константи можуть мати лише скалярні значення.

Перевірка існування констант

Для перевірки константи можна використовувати функцію defined(). Ця функція повертає true, якщо константу оголошено. Наведемо приклад:

// Оголошуємо константу pi
define ("pi", 3.14, true);
if (defined ("pi")== true ) echo "Константа pi оголошена!";
// Скрипт виведе "Константа pi оголошена!"
?>

Зумовлені константи PHP

У PHP існують такі визначені константи:

PHP надає великий список зумовлених констант для кожного скрипта, що виконується. Багато з цих констант визначаються різними модулями і будуть присутні лише в тому випадку, якщо ці модулі доступні в результаті динамічного завантаження або статичного складання.

Є п'ять зумовлених констант, які змінюють значення залежно від контексту, в якому вони використовуються. Наприклад, константа __LINE__залежить від рядка в скрипті, де ця константа вказана. Спеціальні константи нечутливі до регістру та їх список наведений нижче:

Ім'я Опис
__LINE__ Поточний рядок у файлі.
__FILE__ Повний шлях та ім'я поточного файлу.
__DIR__ Повідомлення про файл. Якщо вона включена в включені, то в directory of the included file is returned. Це є equivalent to dirname(__FILE__). Це directory name does не має trailing slash unless it is root directory.
__FUNCTION__ Ім'я функції. (Додано в PHP 4.3.0.)
__CLASS__ Назва класу. (Додано в PHP 4.3.0.)
__TRAIT__ Trait name. Trait name включатиме namespace it був declarated in (e.g. Foo \ Bar).
__METHOD__ Ім'я методу класу. (Додано в PHP 5.0.0)
__NAMESPACE__ Назва поточного namespace.

Додатково

У цій замітці розберемося, у чому різниця в оголошенні PHP констант за допомогою ключового слова const та функції define().

Константи в PHP - це «постійні», значення яких вказується лише один раз і потім не може бути змінено. При спробі змінити значення, воно не зміниться і з'явиться PHP замітка: "Constant already defined" (константа вже визначена):

Define("FOO", "val"); define("FOO", "val2"); // Notice: Constant already defined echo FOO; //> val

Оголошувати константи в PHP можна двома способами:

// 1 define("NAME", "VALUE"); // 2 const NAME = "VALUE";

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

Як створювати константи

PHP менше 5.3

До 5.3 PHP, константи можна було визначати тільки через define() . Ключове слово const з'явилося із версії 5.3.

Константи можуть зберігати лише скаляри. Скалярні змінні - це змінні з типами integer, float, string і boolean. Типи array , об'єкт і ресурс не є скалярними.

// скаляри define("FOO", 10); define("FOO", 10.9); define("FOO", "val"); define("FOO", true); // не скаляри define("FOO", array(1)); // константа не встановитися і отримаємо Warning define("FOO", (object) array(1)); // константа не встановиться і отримаємо Warning

З версії PHP 5.3

З'явилося ключове слово const, і тепер константу можна визначати ще й за допомогою нього.

Однак, у const не можна вказати змінну, функцію або якийсь вираз, а потрібно передавати скаляр «безпосередньо»:

Const FOO = "val"; // немає помилок const FOO = $ var; // Parse error const FOO = home_url (); // Parse error const FOO = 5+10; // Parse error const FOO = "foo". "bar"; // Parse error

Тоді як для define() таких обмежень немає.

Define("FOO", "val"); // немає помилок define("FOO", $ var); // Немає помилок define("FOO", home_url()); // немає помилок define("FOO", 5 + 10); // немає помилок define("FOO", "foo". "bar"); // Немає помилок

PHP 5.6

Стало можливим вказувати значення const примітивні PHP вирази (вирази з скалярів):

Const FOO = 1+2; const FOO = "foo". "bar";

Стало можливим зберігати масиви у константах:

Const FOO =; // працює define("FOO", ); // не працює PHP 5.6, працює у PHP 7.0

Різниця між define() та const

#1 const повинні бути оголошені у верхній області

На відміну від define() , const повинні бути оголошені у верхній області видимості, тому що вони визначаються при компілюванні скрипту. Це означає, що їх не можна оголошувати всередині функцій/циклів/виразів if чи try/catch блоків.

If (1) ( const NAME = "VALUE"; // не працює ) // але if (1) ( define("NAME", "VALUE"); // працює )

#2 const завжди реєстрозалежна

const завжди регістро-залежна, в той час як define() дозволяє зробити регістро-незалежні константи:

Define("NAME", "VALUE", true); echo NAME; // VALUE echo name; // VALUE

#3 const розуміє лише скаляри

Це справедливо тільки для версій PHP 5.6 і нижче.

const не можна передати змінні, функції, вирази, а define() можна:

Const FOO = $ var; // Parse error const FOO = home_url (); // Parse error define("FOO", $ var); // Немає помилок define("FOO", home_url()); // Немає помилок

#4 const може зберігати масиви з версії PHP 5.6, а define з PHP 7.0

const FOO =; // працює у PHP 5.6 define("FOO", ); // не працює PHP 5.6, працює у PHP 7.0
Підсумки порівняння

Визначати константу майже завжди краще за допомогою define(), тому що тут більше можливостей і менше варіантів «зловити» помилку... Виняток - це коли у вас версія PHP 5.6 і вам потрібно зберегти масив у константу, тут допоможе const.

Константи PHP класу

Оголошуються лише за допомогою const. Правила для них такі як описано вище: приймають тільки скаляри, не розуміють PHP змінні, функції, вирази...

Постійні класи завжди загальнодоступні - немає статусу private чи protected.

Оголошена константа належить саме класу, вона належить жодному об'єкту і є спільної попри всі об'єкти (примірники) класу.

Class My_Class ( const NAME = "VALUE"; // починаючи з PHP 5.6 можна використовувати математичні вирази const SEC_PER_DAY = 60 * 60 * 24; function print_name() ( // звернення до константи класу всередині методу через self (сам клас) echo self ::NAME; ) ) // звернення до константи поза класом // можна викликати з глобальної області видимості без ініціалізації екземпляра класу echo My_Class::NAME;

Константи для класів дуже схожі на статичні властивості класу.

Class My_Class ( const NAME = "VALUE"; static $name = "VALUE";; ) echo My_Class::NAME; echo My_Class::$name;

«Чарівні» константи

І на завершення згадаємо про особливі константи PHP...

У PHP є дев'ять магічних констант, які змінюють своє значення залежно від контексту, в якому вони використовуються. Наприклад, значення __LINE__ залежить від рядка в скрипті, де ця константа вказана. Усі "чарівні" константи дозволяються під час компіляції, на відміну від звичайних констант, які дозволяються під час виконання. Спеціальні константи нечутливі до регістру та їх список наведений нижче:

Константа Опис
__LINE__ Поточний номер рядка у файлі.
__FILE__ Повний шлях та ім'я поточного файлу, у якому викликається константа.
__DIR__ PHP 5.3.0. Директорія файлу, де використовується константа. Те саме що dirname(__FILE__) . Не має слеша наприкінці, крім кореневої директорії.
__FUNCTION__ Ім'я функції.
__CLASS__ Назва класу. Це ім'я містить назву простору імен, в якому клас був оголошений (наприклад, Foo Bar). Також працює у трейтах. При використанні методів трейтів є ім'ям класу, у якому ці методи використовується.
__TRAIT__ PHP 5.4.0. Ім'я Трейт. Це ім'я містить назву простору імен, в якому трейт був оголошений (наприклад, Foo Bar).
__METHOD__ Ім'я методу класу.
__NAMESPACE__ PHP 5.3.0. Назва поточного простору імен.
ClassName::class PHP 5.5.0. Повне ім'я класу (із зазначенням простору імен). Також дивіться: class.

Константи- Це значення, які не змінюються з часом. Ще зі школи Ви, напевно, знаєте багато константів, наприклад, число п, число e, прискорення вільного падіння та інші. І, зрозуміло, при програмуванні теж часто виникає необхідність введення констант. І про те, як створювати та використовувати константи в PHP, ми й поговоримо у цій статті.

Давайте з Вами створимо константучисла п:

define(PI, 3.1415926);
echo PI;
?>

Оператор defineстворює константу PIі надає їй значення 3.1415926 . Далі ми виводимо цю константу через оператор echo. Все дуже просто, однак, є одна рекомендація, яку я раджу Вам завжди дотримуватись. Обов'язково пишіть константивеликими літерами. Не те щоб це було обов'язково, але вкрай бажано. І так прийнято не тільки в PHP, але й інших мовах теж.

Зрозуміло, згодом змінити константу PI буде не можна (на те вона і константа).

Тепер розберемо одну функцію, яка перевіряє: " Чи визначено задану константу". Давайте напишемо такий скрипт:

if (!defined("PI")) define(PI, 3.1415926);
echo PI;
?>

Тут перевіряється існування константи PI. І якщо вона не існує (тобто функція define()повернула false), то тоді ініціалізуємо цю константу. Потім просто виводимо її.

Як бачите, створювати та використовувати свої константи у PHP- це дуже просто.

І, насамкінець, хочеться розповісти про вже вбудованих константах PHP. Давайте з Вами напишемо простий скрипт:

phpinfo();
?>

Ближче до кінця є розділ " PHP Variable". Власне, це не зовсім константи, однак, вони є константамипід час виконання даного скрипта. Зрозуміло, під час виконання іншого скрипта вони вже матимуть інші значення (не все, зрозуміло). Давайте з Вами виведемо пару констант, щоб Ви зрозуміли, як з ними працювати, адже вони використовуються дуже часто:

echo $_SERVER["REMOTE_ADDR"];
echo "
";
echo $_SERVER["QUERY_STRING"];
?>

У цьому скрипті ми виводимо IP-адреса користувача, що запустив скрипт, а на наступному рядку виводимо рядок запиту (наприклад, " index.php?id=7Забігаючи трохи вперед, кажу, що тут ми працюємо з глобальним масивом $_SERVER. З масивами ми ще познайомимося, але думаю, що ті, хто працював з масивами в інших мовах програмування, без проблем дізнаються синтаксис. Що ж до інших констант, то з ними робота відбувається аналогічно.

У цій нотатці мова йтиме про константів. Як завжди розберемося з самим поняттям константи в мовах програмування і подивимося, як оголошуються та використовуються константи у PHP.

Поняття константа та константи в PHP

Слово константа має бути вам уже знайоме з математики:

“Математична константа- величина, значення якої змінюється.”

Теж саме і в PHP. Константа у PHP- це ідентифікатор, який служить для позначення простого значення (рядок, число якесь), яке не може змінюватися в процесі виконання коду.

Для оголошення константи (присвоєння їй значення) використовується функція define. Приклад оголошення константи:

Імена констант у PHP чутливі до регістру (великі та маленькі літери різняться), так що потрібно бути уважнішими. Також є угода, що імена констант завжди пишуться у верхньому регістрі.

Ім'я константи має починатися з літери або символу підкреслення "_" і може складатися з букв, цифр та підкреслення.

Розглянемо простий приклад використання константи:

У цьому прикладі ми оголосили константу та використали її у програмі.

Навіщо використовуються константи і чи не простіше використовувати змінні?

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

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

Використання констант гарантує, що значення, яке ви вказали при оголошенні константи, залишиться незмінним.