PHP

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку
PHP
PHP
Парадигмаімперативна, об'єктно-орієнтована, функціональна
Дата появи1995
ТворціРасмус Лердорф
РозробникThe PHP Group
Останній реліз8.3.+[1] (18 січня 2024; 10 місяців тому (2024-01-18)[2])
Тестова версіяPHP 8.3.0 RC 6[3] (9 листопада 2023; 12 місяців тому (2023-11-09))
Система типізаціїслабка типізація[d], динамічна типізація[d] і gradual typingd
Під впливом відC++, Perl[4], C[4], Java[4], Tcl[5], HTML і JavaScript
Мова реалізаціїC[6]
Операційна системаUNIX-подібні операційні системи і Windows
ЛіцензіяPHP Licensed[7]
Звичайні розширення файлів.php[8] або .phar[9]
Репозиторій вихідного кодуgithub.com/php/php-src
Вебсайтphp.net

PHP (англ. PHP: Hypertext Preprocessor — PHP: гіпертекстовий препроцесор), попередня назва: Personal Home Page Tools — скриптова мова програмування, була створена для генерації HTML-сторінок на стороні вебсервера. PHP є однією з найпоширеніших мов, що використовуються у сфері веброзробок (разом із Java, .NET, JavaScript, Python, Ruby)[10]. PHP підтримується переважною більшістю хостинг-провайдерів. PHP — проєкт відкритого програмного забезпечення.

PHP інтерпретується вебсервером у HTML-код, який передається на сторону клієнта. На відміну від скриптової мови JavaScript, користувач не бачить PHP-коду, тому що браузер отримує готовий html-код. Це є перевагою з точки зору безпеки, але погіршує інтерактивність сторінок. Але ніхто не забороняє використовувати PHP для генерування JavaScript-кодів, які виконуються вже на стороні клієнта.

Особливості

[ред. | ред. код]

PHP — мова, у код якої можна вбудовувати безпосередньо html-код сторінок, які, у свою чергу, коректно оброблюватимуться PHP-інтерпретатором. Обробник PHP просто починає виконувати код після відкриваючого тегу (<?php) і продовжує виконання до того моменту, поки не зустріне закриваючий тег.

Велика різноманітність функцій PHP дає можливість уникати написання багаторядкових функцій, призначених для користувача, як це відбувається в C або Pascal.

Наявність інтерфейсів до багатьох баз даних

[ред. | ред. код]
  • у PHP вбудовані бібліотеки для роботи з MySQL, PostgreSQL, SQLite, mSQL, Oracle, dbm, Hyperware, Informix, InterBase, Sybase.
  • завдяки стандарту відкритого інтерфейсу зв'язку з базами даних (англ. Open Database Connectivity Standard, ODBC) можна підключатися до всіх баз даних, до яких існує драйвер.

Нетрадиційність

[ред. | ред. код]
Мова PHP здаватиметься знайомою програмістам, що працюють у різних областях. Багато конструкцій мови запозичені з С, Perl. Код PHP дуже схожий на той, який зустрічається в типових програмах мовами С або Pascal. Це помітно знижує початкові зусилля при вивченні PHP. PHP — мова, що поєднує переваги Perl та С і спеціально спрямована на роботу в Інтернеті, мова з універсальним і зрозумілим синтаксисом. І хоча PHP є досить молодою мовою, вона здобула таку популярність серед web-програмістів, що в наш час є найпопулярнішою мовою для створення вебзастосунків (скриптів).

Наявність сирцевого коду та безкоштовність

[ред. | ред. код]
Стратегія Open Source, і розповсюдження початкових текстів програм у масах, безсумнівно справили сприятливий вплив на багато проєктів, в першу чергу — Linux хоч і успіх проєкту Apache сильно підкріпив позиції прихильників Open Source. Сказане відноситься і до історії створення PHP, оскільки підтримка користувачів зі всього світу виявилася дуже важливим чинником у розвитку проєкту PHP. Ухвалення стратегії Open Source і безкоштовне розповсюдження початкових текстів PHP надало неоціненну послугу користувачам. Окрім цього, користувачі PHP в усьому світі є свого роду колективною службою підтримки, і в популярних електронних конференціях можна знайти відповіді, навіть на найскладніші питання.

Ефективність

[ред. | ред. код]
Ефективність є дуже важливим чинником у програмуванні для середовищ розрахованих на багато користувачів, до яких належить і web. Важливою перевагою PHP є те, що ця мова належить до інтерпретованих. Це дозволяє обробляти сценарії з достатньо високою швидкістю. За деякими оцінками, більшість PHP-сценаріїв (особливо не дуже великих розмірів) обробляються швидше за аналогічні їм програми, написані на Perl. Проте хоч би що робили розробники PHP, виконавчі файли, отримані за допомогою компіляції, працюватимуть значно швидше — в десятки, а іноді і в сотні разів. Але продуктивність PHP достатня для створення цілком серйозних вебзастосунків.

Історія

[ред. | ред. код]

Перші версії

[ред. | ред. код]

Історія PHP починається з 1995 року, коли Расмус Лердорф (англ. Rasmus Lerdorf) створив простий застосунок мовою Perl, що аналізував відвідування користувачами його резюме на вебсайті. Потім, коли цим застосунком вже користувалися кілька осіб, а число охочих одержати його постійно збільшувалося, Лердорф назвав своє творіння Інструменти для особистої домашньої сторінки англ. Personal Home Page Tools версія 1 і виставив для вільного завантаження. З цієї миті почався небувалий зліт популярності PHP.

Як це завжди буває, терміново було потрібне доопрацювання і нові доповнення. Для їхньої реалізації Расмус створює нову версію пакету, тепер уже написану на С. Отриманий таким чином інструмент набуває робочої назви PHP/FI (укр. Персональна Домашня сторінка / Інтерпретатор Форм, англ. Personal Home Page / Forms Interpreter), надалі він також буде відомий під назвою PHP 2. Ця версія вже більшою мірою схожа на сьогоднішній PHP. Вона мала синтаксис і спосіб іменування змінних у стилі мови Perl, можливість вбудовування PHP операторів в html-код сторінки, автоматичну інтерпретацію форм, інтеграцію з базами даних. При цьому все працювало досить швидко, оскільки PHP прикомпілювалася до вебсервера Apache. До 1997 року PHP використовувався вже на 50 000 доменах (не більше 1 % всіх вебсерверів)[11].

Того ж 1997 року до проєкту PHP підключилися Зев Сураскі (англ. Zeev Suraski) і Енді Ґутманс (англ. Andi Gutmans). Ці студенти Техніону, одного з найкращих[джерело?] ізраїльських університетів, намагалися використовувати PHP/FI для одного з комерційних університетських проєктів. При цьому їм довелося зіткнутися з багатьма труднощами і обмеженнями цієї технології. Вивчаючи початковий код PHP 2, Зев і Енді дійшли висновку про необхідність доопрацювання, а точніше істотної переробки PHP, особливо в плані синтаксису мови. Протягом декількох місяців вони блискуче впоралися з цим завданням[11].

Закінчивши роботу, Зев і Енді домовились із Расмусом про співпрацю в галузі розвитку та вдосконалення мови. З цієї миті з'являється PHP Group — група однодумців, що працюють над розвитком технології PHP. Одержаний продукт з'явився на світ 1998 року під назвою PHP 3.

При цьому головною особливість PHP 3 була можливість розширення ядра, що привернуло до роботи над PHP безліч сторонніх розробників, що створюють спеціалізовані модулі. Їх наявність дала PHP можливість працювати з величезною кількістю баз даних, протоколів, підтримувати велике число API. До кінця 1998 року кількість користувачів PHP перевищила 100 тисяч, а PHP був уже встановлений на понад 10 % серверах Інтернету. Водночас значному поширенню даної мови сприяли публікації в електронній пресі та видання посібників із PHP.

Відразу ж після виходу PHP 3, Енді Гутманс і Зев Сураскі почали переробку ядра PHP. Насамперед належало розв'язати проблему підвищення продуктивності. Новий продукт, названий Zend Engine (від імен творців: Zeev і Andi), успішно справлявся з поставленим завданням і був реалізований 1999 року. Основними реалізованими ідеями є можливість компіляції сценарію у виконуваний модуль, за рахунок чого продуктивність можна було підняти на порядок.

PHP 3 та PHP 4

[ред. | ред. код]

Зеєв Сураскі та Ані Гутманс переробили аналізатор в 1997 році і сформували базу PHP 3, змінивши назву мови на рекурсивний акронім PHP: Hypertext Preprocessor.  Після цього почалося публічне тестування PHP 3, а офіційний запуск відбувся в червні 1998 року. Після цього Сураскі та Гутманс розпочали нове перекодування ядра PHP, видавши Zend Engine у 1999 році. Вони також заснували Zend Technologies в Рамат-Гані, Ізраїль.

22 травня 2000 р. Був випущений PHP 4 з підтримкою Zend Engine 1.0.  Станом на серпень 2008 року ця філія досягла версії 4.4.9. PHP 4 більше не розробляється, оновлення безпеки також більше не були випущені.

14 липня 2004 р. Був випущений PHP 5 з новим двигуном Zend Engine II.  PHP 5 включав нові функції, як-от покращена підтримка об'єктно-орієнтованого програмування, розширення PHP Data Objects (PDO) (який містить легкий і послідовний інтерфейс для доступу до баз даних) та численні поліпшення продуктивності. У 2008 році PHP 5 став єдиною стабільною версією, що розроблялася. Пізній статичний зв'язок відсутній у PHP і був доданий у версії 5.3.

Багато високопрофесійних проєктів із відкритим кодом з 5 лютого 2008 року перестали підтримувати PHP 4 в новому коді, оскільки це ініціатива GoPHP5, що надається консорціумом розробників PHP, що сприяє переходу від PHP 4 до PHP 5.

З часом інтерпретатори PHP стали доступними для більшості існуючих 32-розрядних та 64-розрядних операційних систем, або будували їх із вихідного коду PHP, або використовували попередньо побудовані двонарні файли. Для версій PHP версії 5.3 та 5.4 єдиними доступними двосторонніми дистрибутивами Microsoft Windows були 32-розрядні версії x86, що вимагають 32-розрядний режим сумісності Windows при використанні інформаційних служб Інтернету (IIS) на 64-розрядній платформі Windows. PHP версії 5.5 зробив збірки 64-розрядних x86-64 доступними для Microsoft Windows.

PHP 6 та Unicode

[ред. | ред. код]

PHP отримав змішані відгуки через відсутність власної підтримки Unicode на рівні основної мови. У 2005 році був започаткований проєкт, очолюваний Андрієм Змієвським, для залучення рідної підтримки Unicode на PHP, шляхом вбудовування бібліотеки «Міжнародні компоненти для Unicode» (ICU) та вбудованих текстових рядків як UTF-16. Оскільки це призведе до серйозних змін як до внутрішньої частини мови, так і до коду користувача, планувалося випустити його як версію 6.0 мови разом з іншими основними функціями, які розвиваються.

Проте дефіцит розробників, які зрозуміли необхідні зміни та проблеми продуктивності, що виникають внаслідок перетворення на UTF-16 та з нього, що рідко використовується в вебконтексті, призвело до затримок проєкту. Як результат, випуск PHP 5.3 був створений у 2009 році, при цьому багато не-Unicode-функцій було відновлено з PHP 6, зокрема простору імен. У березні 2010 року проєкт у своїй нинішній формі був офіційно відкинутий, і був підготовлений випуск PHP 5.4, що містить більшість опублікованих функцій, що не входять до Unicode, з PHP 6, як-от риси та переприв'язка до закриття. Початкові сподівання полягали в тому, що для інтеграції з Unicode був би сформований новий план, але з 2014 року ніхто не був прийнятий.

Впродовж 2014 та 2015 років було розроблено нову основну версію PHP, яку було пронумеровано PHP 7. Нумерація цієї версії викликала дебати[12]. Хоча реліз PHP 6 з Unicode ніколи не був випущений, декілька назв статей і книг посилалися на назву PHP 6, що могло викликати плутанину, якби новий реліз повторно використовував цю назву[13]. Після голосування було обрано назву PHP 7[14].

PHP 7 вийшла 3 грудня 2015 року[15] і містить такі ключові нововведення[16]:

  • Завдяки суттєвим допрацюванням нова версія дала приріст продуктивності в 2—3 рази на реальних проєктах.[17]
  • Можливість декларування скалярних типів.
    <?php
    function sumOfInts(int ...$ints)
    {
        return array_sum($ints);
    }
    
  • Можливість декларувати тип, того що має повернути метод.
    <?php
    
    function arraysSum(array ...$arrays): array
    {
        return array_map(function(array $array): int {
            return array_sum($array);
        }, $arrays);
    }
    
  • Анонімні класи
    <?php
    
    $app = new Application;
    $app->setLogger(new class implements Logger {
        public function log(string $msg) {
            echo $msg;
        }
    });
    
  • Додані нові операції «$a ?? $b» (аналогічно !is_null($a) ? $a : $b) та «$a <=> $b» (повідомляє чи більший, менший чи рівний параметр $a до $b).

26 листопада 2020 року вийшло нова версія php, PHP 8[18]. Серед ключових нових можливостей мови:[19]

  • Іменовані аргументи.
    <?php
    htmlspecialchars($string, double_encode: false);
    
  • Замість анотацій PHPDoc тепер ви можете використовувати структуровані метадані з власним синтаксисом PHP.
  • Опис властивостей на рівні конструктора
    <?php
    class Point {
      public function __construct(
        public float $x = 0.0,
        public float $y = 0.0,
        public float $z = 0.0,
      ) {}
    }
    
  • Об'єднання типів
    <?php
    
    function foo(int|float $a) {]
    
  • Оператор nullsafe. Якщо якийсь об'єкт / метод / властивість не визначена тоді результат буде null.
    <?php
    
    $country = $session?->user?->getAddress()?->country;
    
  • JIT-компіляція

Визнання та поширення

[ред. | ред. код]

PHP 4, що працює на цьому ядрі, вийшов 2000 року. На додаток до збільшення продуктивності, PHP 4 мав нові можливості щодо підтримки сесій, буферизацію виводу, безпечні способи обробки інформації, що вводиться користувачем, і нові мовні конструкції. З виходом 4 версії PHP став використовуватися вже на більш ніж 20 % доменів Інтернету.

Протягом 2000—2004 років продовжувалися активні роботи з покращення четвертої версії, але майже відразу PHP Group приступила до продумування можливостей нової версії. Насамперед було вирішено підсилити об'єктні можливості мови, що дозволяло використовувати його для реалізації масштабних проєктів. Роботи із створення п'ятої версії велися тривалий час, в них брало участь рекордна кількість фахівців, зокрема Стерлінг Хьюз (англ. Sterling Hughes) і Маркус Бергера (англ. Marcus Boerger).

У липні 2004 року виходить офіційний реліз PHP 5. У першу чергу, як і планувалося, було перероблено весь механізм роботи з об'єктами. І якщо в попередніх версіях об'єктно-орієнтоване програмування на PHP було можливе в мінімальному ступені, а тому і використовувалося на практиці не часто, то PHP 5 володіє прекрасним[джерело?] потенціалом реалізації об'єктного програмування. Окрім цього, PHP збагатився рядом цінних[кому?] розширень для роботи з XML, різними джерелами даних, генерації графіки і інше.

Серед інших украй корисних доповнень в PHP 5 слід зазначити нову схему обробки винятків. Конструкція try/catch/throw дозволяє весь код обробки помилок локалізувати в одному місці сценарію.

Всі основні бібліотеки для роботи з XML, запозичені в PHP 4, були піддані серйозній переробці. Такі популярні розширення, як SAX, DOM і XSLT, тепер використовують інструмент libxml2, що робить їх ще ефективнішими.

У PHP 5 також включені два нові модулі для роботи з протоколами — SimpleXML і SOAP. SimpleXML дозволяє значно спростити роботу з XML-даними, представляючи вміст XML-документа у вигляді PHP-об'єкта. Розширення SOAP дозволяє будувати на PHP сценарії, що обмінюються інформацією з іншими застосунками за допомогою XML-повідомлень поверх існуючих вебпротоколів, наприклад HTTP. Модуль для роботи з SOAP для PHP 5 надає розробникам засіб для достатньо швидкого створення ефективних SOAP-клієнтів і SOAP-серверів[11].

Новий модуль PHP 5 MySQLi (MySQL Improved) призначений для роботи з MySQL-сервером версій 4.1.2 і вище, реалізовуючи не тільки процедурний, але і об'єктно-орієнтований інтерфейс до MySQL. Додаткові можливості цього модуля включають — SSL, контроль транзакцій, підтримка реплікації та інші.

Шоста версія PHP розроблялася з жовтня 2006 року. Було зроблено безліч нововведень, як, наприклад, виключення з ядра регулярних виразів POSIX і «довгих» суперглобальних масивів, видалення директив safe_mode, magic_quotes_gpc і register_globals з конфігураційного файлу php.ini. Одним з основних нововведень повинна була стати підтримка Юнікоду. Однак у березні 2010 року розробка PHP6 була визнана безперспективною через складнощі з підтримкою Юнікоду. Вихідний код PHP6 переміщений на гілку, а основною лінією розробки стала версія 5.4.

У 2014 році було проведено голосування, за результатами якого наступна версія отримала назву PHP 7. Вихід нової версії планувався в середині жовтня 2015 року. У березні 2015 року Zend представили інфографіку в якій описані основні нововведення PHP 7.

3 грудня 2015 року було оголошено про вихід PHP версії 7.0.0.

Нова версія ґрунтується на експериментальній гілці PHP, яка спочатку називалася phpng (PHP Next Generation — наступне покоління), і розроблялася з нахилом на збільшення продуктивності і зменшення споживання пам'яті. У новій версії додана можливість вказувати тип повертаються з функції даних, доданий контроль переданих типів для скалярних даних, а також нові оператори.

Синтаксис

[ред. | ред. код]

Відокремлення PHP коду від HTML розмітки

[ред. | ред. код]

Всі сценарії оформляються у вигляді блоків коду. Ці блоки можуть бути поміщені в HTML-код, але відділені від нього відповідними обмежувачами. Код PHP в HTML повинен знаходитись між початковим тегом <?php та кінцевим ?> (або між <script language="php"> та </script>) Бажаним варіантом виділення PHP коду є варіант <?php ?>, оскільки саме такі початковий та кінцевий теги дозволять використовувати PHP код у документах, які відповідають правилам XML. Також можна використовувати скорочений запис <? ?> (інколи потрібно активізувати даний стиль у файлі налаштувань інтерпретатора php.ini: змінна short_open_tag повинна мати значення On) і записом у стилі ASP: <% %> (в php.ini змінна asp_tags повинна мати значення On). Проте, стиль ASP не рекомендується і очікується, що він буде відсутній у PHP 6[джерело?].

Найпростіша програма Hello world на PHP виглядає так:

 <?php
   echo 'Hello, world!';
 ?>

PHP виконує код, що знаходиться в середині обмежувачів на кшталт <?php ?>. Все, що знаходиться поза обмежувачами, виводиться без змін. Таким чином виконується вставка PHP-коду в HTML-код. Наприклад, код html-сторінки з попереднім прикладом виглядатиме так:

<html>
  <head>
    <title>Тестуємо PHP</title>
  </head>
  <body>
    <?php echo 'Hello, world!'; ?>
  </body>
</html>

Відокремлення інструкцій

[ред. | ред. код]

Інструкції в PHP відокремлюються символом ;. Перед закінченням скрипту (перед тегом ?>) крапку з комою ставити необов'язково.

Коментарі

[ред. | ред. код]

Коментарі у PHP можуть бути як однорядкові, так і багаторядкові. Однорядкові коментарі починаються з // або # (коментар скриптових мов UNIX). Багаторядкові коментарі починаються символами /* і закінчуються */. Слід зазначити, що однорядкові коментарі йдуть або до кінця поточного рядка, або до завершального тегу ?>. Наприклад:

// це однорядковий коментар
# і це також однорядковий коментар
/*
 а ось це вже багаторядковий коментар
*/

Змінні

[ред. | ред. код]
Докладніше: Змінна

Основою будь-якого програмування є змінні. PHP, як і деякі інші UNIX-скриптові мови, не потребує їх опису. Існує три стилі оформлення змінних у PHP:

  • короткий стиль — змінні записуються у вигляді: $variable. Використовується в більшості випадків. Змінна, яка створюється програмним кодом, записується таким чином. Можливо також використання такого стилю для добування змінної із ФОРМИ, якщо ввімкнено register_globals у файлі конфігурації php.ini.
  • середній стиль — $_POST['variable'], $_GET['variable'], $_REQUEST['variable']. Використовується для отримання даних із полів ФОРМИ. Залежно від типу передачі даних установлюється POST або GET або REQUEST для обох випадків. Дані змінні називаються також глобальними.
  • довгий стиль — $HTTP_POST_VARS['variable'], $HTTP_GET_VARS['variable']. Найповніший стиль запису і найменш використовуваний. Починаючи з PHP 5, ці змінні можна вимкнути. Використовувати змінні такого типу не рекомендовано задля кращої сумісності із майбутніми версіями PHP.

Приклад запису змінної з десятковим дробом та рядкової змінної: php

З точки зору системи типізації, PHP є мовою програмування з динамічною типізацією[20]. Немає необхідності явного визначення типу змінних, хоча така можливість існує. У разі звернення до змінної, інтерпретатор PHP тлумачить її тип відповідно до контексту. За необхідності можливе приведення змінної до певного типу за допомогою відповідних конструкцій мови. Це може знадобитись, якщо зважити, що значення змінної можуть трактуватись по-різному в залежності від її типу. Також можливе визначення типу відповідної змінної на певному етапі виконання сценарію. Імена змінних чутливі до регістру символів.

Типи даних

[ред. | ред. код]
Докладніше: Тип даних

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

# перший вид надання змінній типу даних
$var1 = true;
$var2 = '1abc';
$var3 = 'abc1';
settype($var1, 'string'); // видасть рядок 1
settype($var2, 'integer'); // видасть число 1
settype($var3, 'bool'); // видасть true

# другий тип надання змінній типу даних
$var1 = (int);
$var1 = '1abc';
echo $var1; // видасть число 1

Робота з рядками

[ред. | ред. код]

Рядки ділять на два класи — рядки, що підлягають аналізу, та ті, що не підлягають. Перший клас досліджується інтерпретатором на наявність посилань на інші змінні, і за умови їхньої наявності робиться підстановка значень у відповідне місце. Крім того, клас дозволяє проводити маніпуляції з керівними символами. Символ рядка може мати лише одне з 256 значень, але є можливість працювати з багатобайтовими символами. Доступ до символів рядка можливий із використанням синтаксису, схожого на доступ до елементів масивів.

PHP надає широкий спектр функцій для пошуку та заміни тексту в рядках. Для цього використовують як традиційний підхід, так і спеціальний, що базується на використанні регулярних виразів. При цьому в мові реалізована підтримка двох видів регулярних виразів — Perl-сумісні та POSIX-сумісні, що розрізняються за синтаксисом та особливостями роботи.

Змішані типи даних

[ред. | ред. код]

До змішаних типів належать масиви, хеші та об'єкти. Масиви з погляду мови програмування є впорядкованими наборами однотипних змінних. Вимога однотипності наповнення масивів не ставиться. Технічно, масиви — це впорядковані карти, що відображають ключові значення на позиції змінних даних. Вмістом значення, на яке вказує ключ може бути будь-чим, що можна подати у вигляді змінної. Не існує жодних обмежень, крім обсягу пам'яті, що накладаються на кількість ключів масиву.

Особливістю мови є відмова від рівномірного розподілу ключів масивів. Реалізовано і модель багатовимірних масивів, причому без явного обмеження глибини вкладеності. Корисною властивістю PHP є можливість асоціації масивів із функцією зворотного виклику. Ці функції дозволяють проводити дії над одним чи кількома масивами в пакетному режимі. PHP наділений великою кількістю функцій роботи з масивами. У PHP можна по-різному оголошувати масиви:

# перший вид
$var = array('key' => 'value'); // створить масив $array.
print_r($var); // Array ( ['key'] => 'value' )

# другий вид
$var[0] = 0;
$var[1] = 'Hello World';
$var['key'] = 'Інший рядок';
print_r($var); // Array ( [0] => 0 [1] => 'Hello World' ['key'] => 'Інший рядок' )

# третій вид
$var[] = 'string';
$var[] = 24081991;
$var[] = 25.00;
print_r($var); // Array ( [0] => 'string' [2] => 24081991 [3] => 25.00 )

# Четвертий вид (доступний з PHP 5.4)
$var = [ 'foo' => 'bar' ];
print_r($var); // Array ( ['foo'] => 'bar' )

Також, існують два спеціальні типи даних — ресурс та NULL. Ресурс — спеціальна змінна, що містить посилання на зовнішній ресурс. Ресурси створюються та використовуються в спеціалізованих функціях. Оскільки тип містить спеціальні вказівники на відкриті файли, під'єднання (англ. include) та інше, то будь-які дії над значенням ресурсу не мають сенсу.

Область видимості змінної — середовище, в якій вона визначена. Розрізняють локальні та глобальні змінні. За замовчуванням, всі змінні мають локальний характер дії. Виділяють особливий тип змінних — статичні, що дозволяє повторне звернення до змінної в певному сегменті коду, причому змінна буде зберігати попередньо отримане значення. Існує також поняття суперглобальних змінних, які є місцем збереження даних оточення або даних, отриманих ззовні. Підтримується концепція динамічних змінних та функцій.

Константи у PHP — ідентифікатори простих значень. Можливе визначення константи, причому після її оголошення стає неможливою зміна її значення чи анулювання. Константи можуть мати лише скалярні значення. Підтримується можливість отримання значення константи за динамічним ім'ям. Область видимості констант є глобальною для сценарію та всіх під'єднаних компонентів. Також у ядрі мови визначено чимало системних констант.

Конструкції мови

[ред. | ред. код]

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

Функції з погляду мови програмування є контейнерами коду, причому можливе включення інших функцій та класів. На цьому і базується можливість умовного визначення функції. У цьому випадку висувається вимога попередньої декларації викликаної функції, що не обов'язкове в інших випадках. Можливості перевизначення чи деактивації функції не існує. Результат, який повертає функція може мати будь-який тип.

У мові реалізована функціональність посилань. Можливо створити необмежену кількість псевдонімів, що посилаються на єдиний сегмент даних. При вивільненні будь-якого з псевдонімів, сегмент даних залишається в пам'яті до моменту завершення сценарію або вивільнення усіх посилань.

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

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

Для побудови програмних комплексів можна використовувати модульний підхід, виконуючи розділення різнорідного коду. При потребі, можливе виконання під'єднання необхідних модулів, причому операція виконання може бути і умовною. Під'єднані до скрипту файли можуть повертати значення.

Додаткові можливості

[ред. | ред. код]

Мова явно підтримує HTTP cookies відповідно до специфікацій Netscape. Це дає змогу проводити встановлення та читання невеликих сегментів даних на стороні клієнта. PHP надає можливість організації роботи з користувачем впродовж сеансів (сесій). У сесії можна зберігати різні дані, включаючи об'єкти.

Створення GUI-додатків

[ред. | ред. код]

PHP не орієнтований на створення додатків, але є потреба створення інтерфейсів, задля: налаштувань серверів, безперервного виконання, налагодження скриптів (сценаріїв), керування локальних, тестових серверів, тощо. Через це й виникли розв'язання проблеми.

Розширення

[ред. | ред. код]

Основна серед реалізацій — використання розширень, що фактично є надлаштунками для UI-бібліотек.

Загалом, розширення виокремлюються на три типи: php-розширення, FFI-обгортки (розширення, що використовують системні функції через технологію FFI) та консольні обгортки (розширення, що спілкуються із php безпосередньо через командний інтерфейс)

До перших можна віднести: WxPHP [Архівовано 22 січня 2019 у Wayback Machine.] (Windows, Linux, Mac OS X), Winbinder [Архівовано 3 березня 2019 у Wayback Machine.] (Windows)

До других відносяться: Win32Std [Архівовано 17 листопада 2019 у Wayback Machine.], Tk [Архівовано 28 листопада 2018 у Wayback Machine.] (реалізація для Python)

До третіх належать: PHP-UI [Архівовано 11 грудня 2018 у Wayback Machine.], PHP-XCB [Архівовано 4 січня 2017 у Wayback Machine.]

Також є розширення, що становить собою двосторонню обгортку, як використання інших мов для розширення php, так і навпаки — PSV Component Library, — проєкт, що складається із трьох суб-проєктів: PHP4Delphi [Архівовано 11 червня 2018 у Wayback Machine.] (основний проєкт, автор — Сергій Перевознюк): Реалізація поєднання php із Delphi-програмою через засоби WinAPI

активно розроблювалося з 1999 року, але через зайнятість автора, не оновлювалося вже 4 роки, через що з'явилися форки — відгалуження, з оновленнями, які можна переглянути за посиланням https://github.com/perevoznyk/php4delphi/network [Архівовано 11 червня 2018 у Wayback Machine.], одним із таких є PHP4Lazarus [Архівовано 11 червня 2018 у Wayback Machine.].

Проєкт PHP extensions development framework (другорядний): Засоби для створення php-розширень, VCL-компоненти, хоч цей проєкт і виокремлює автор, але він є невіддільною частиною PHP4Delphi [Архівовано 11 червня 2018 у Wayback Machine.], базові компоненти якого, мають бути використані для створення застосунків

Проєкт php4Applications (другорядний) — розширення для інших мов, що дає можливість легко використовувати php у C#, C, Lazarus, Delphi, C++, базується на PHP4Delphi [Архівовано 11 червня 2018 у Wayback Machine.] (надає доступ до макросів, що спрощують використання php і позбавляють потреби написання власної обгортки).

Середовища розробки графічних інтерфейсів

[ред. | ред. код]

Але є місце й повноцінним середовищам розробки, із можливістю створення програм:

DevPHP (IDE)
[ред. | ред. код]

Піонером у цій категорії є студія DevPHP-IDE, що використовувала Kylix(Delphi), як основний інтерфейс, та php-Cli задля створення користувацьких програм.

Вона містила редактор коду, декілька інструментів та візуальний перегляд HTML-сторінок.

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

CodeGear Rad Studio (Extension)
[ред. | ред. код]

Після неї з'явилося розширення — набір компонентів для CodeGear Rad Studio 2009, на базі php4delphi, з деякими покращеннями (вебелементи, інспектор, зневаджувач), тривала її підтримка протягом 4 версій, друга з яких увійшла в платне доповнення Rad Studio 2010: Була можливість використовувати скрипти, надавати стиль вебкомпонентам, переглядати стилі і вебсторінку до збірки програми, запускати локальний сервер, збирати програму, як окремий застосунок та налагоджувати код.

Починаючи з третьої версії, розширенню студії дали назву PHPDev Xe, згодом Delphi зазнала перевтілень, і, розробку PHPDev Xe було призупинено на невизначений термін.

DevelStudio (RAD)
[ред. | ред. код]

У 2009 році на базі того самого розширення з'явилася студія, згодом, до розробки студії MessBox DVI, приєднався Ростислав Романов, і вона змінила назву на DevelStudio, перша версія з такою назвою (0.1.7) мала невелику кількість компонентів у наборі інструментів, і підтримувала лише php 4.

У 2-й версії, DevelStudio отримала підтримку php 5, були добавлені потоки, та внесені численні зміни. Код збірки (генерації) програм було закрито, а попередні версії, як і форум самої програми, затерто, з метою перешкоджання зловмисникам.

Також, друга версія була інтегрована з набором компонентів AlphaControls [Архівовано 12 квітня 2022 у Wayback Machine.], через який проблема із вірусами здобула нечуваного масштабу — середовище програмування стало широко вживаним серед початківців хакерів, та популярні на той час антивіруси (MacAffie, AVG, Avira) включили стаб середовища до архіву вірусів, через що, користуватися нею стало неможливо.

Через деякий час, автор AlphaControls [Архівовано 12 квітня 2022 у Wayback Machine.] звернувся зі скаргою до розробників, й набір компонентів було повністю вирізано з середовища, але — з нових версій; у цей раз видалити посилання на попередні версії не вдалося, форум був незадоволений.

У 3-й версії середовища з'явилися нові компоненти, в тому числі й браузер Chromium, замість IE, що зосередило увагу веброзробників, й користувачів середовища «Алгоритм» (схожа ідея — програмування на мові HTML). На той момент компіляція програм у «Алгоритмі» була платна, тому DevelStudio, як нове і безкоштовне середовище розробки, переманила на себе більшість аудиторії.

З виходом версії 3.0.2 (2012 рік), розробка середовища зупинилася — головний розробник утратив сирці (початкові коди).

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

Після публікації сирців, що залишилися, у 2014 році почалися перші кроки по відновленню, було зібрано версію, що працювала з проєктами.

Лише наприкінці 2018 року весь початковий код [Архівовано 28 квітня 2019 у Wayback Machine.] було відновлено, він був узятий за основу іншої студії — PDL (Project Development Laboratory, пізніше — PHP DL).

Після звернення у 2019 році до автора, щодо зміни політики поширення студії, та скаргою на відсутність посилань на використані бібліотеки (DCEF, PHP4Delphi, TSizeCtrl, SynEdit), форум DevelStudio було видалено, а одну з сторінок з описом проєкту переспрямовано на головну сторінку (DevelStudio.org)

PHPQt (IDE)
[ред. | ред. код]

У 2015 році Олександр Казанцев почав вивчати алгоритми розробки інтерфейсів, й створив розширення php_qml [Архівовано 11 червня 2018 у Wayback Machine.], що давало змогу створювати віджети з бібліотеки QT, але мало підтримку лише на Windows.

З цього почалася розробка PHPQt [Архівовано 1 квітня 2022 у Wayback Machine.], перші версії не виявляли до себе інтересу з сторони веброзробників, тому автор почав поглиблено допрацьовувати розширення.

28 липня 2015 року був опублікований перший варіант компілятора проєктів, на той момент це був простий виконувач скриптів, що прикріпляв php-код до стабу (як DevelStudio), і мав залежність від WinAPI => Windows, на цій вже стадії підтримувалися майже всі віджети й багатопотоковість, була оптимізація php-коду. З цього моменту двигун назвали PQEngine,

3 серпня 2016 року вийшла п'ята версія компілятора застосунків (PqBuilder), що перейшов на базу PlastiQ, й мав підтримку вже новітнього на той час php 7, проєкти отримали більш повноцінний компілятор і вже не потребували наявності PqEngine.dll поблизу з виконуваним файлом, натомість візуальні бібліотеки стали додаватися статично — як файли, а не вшиватися усередину програми. Такий крок був прийнятий задля сумісності з іншими системами, та оригінальними бібліотеками Qt.

З появою шостої версії, проєкт став доповненням до студії Qt Studio, а компілятор став усього лише оптимізатором перед кінцевою зборкою програми. З'явився повноцінний редактор інтерфейсу, підказки в редакторі кода, та почала створюватися документація. З цього моменту зробили анонс щодо створення PqStudio, але її розробка не зайшла далеко.

DevelNext (IDE)
[ред. | ред. код]

Паралельно із цим, головний розробник DevelStudio почав створювати нове середовище програмування, із старою ідеєю — DevelNext [Архівовано 11 червня 2016 у Wayback Machine.], студія взяла за основу графічну бібліотеку Swing та JavaFX, в результаті вийшло повністю нове середовище, із підтримкою CSS, але повністю без підтримки PHP — проєкт був заснований на власній мові програмування — також інтерпретовуваній, jPHP, і проіснував у цьому вигляді до 17-ї версії (17-RC1), на якій проєкт і був покинутий.

У 16-й версії, середовище DevelNext отримало підтримку php 7, й була розширена ентузіастами для розробки на OS Android.

Підключення PHP до проєкту

[ред. | ред. код]

Також існують розширення, для геометрально-протилежного застосування — підключення PHP до проєкту на іншій мові програмування: Phalanger [Архівовано 1 травня 2019 у Wayback Machine.] (C#) — php 5.4, Peachpie [Архівовано 20 липня 2019 у Wayback Machine.] (C#) — php 7, PHP4Delphi [Архівовано 11 червня 2018 у Wayback Machine.](Lazarus, Delphi, C#, C, C++) — php 5.6, JPHP [Архівовано 5 жовтня 2018 у Wayback Machine.](Java) — php 7.0, PHPly [Архівовано 11 червня 2018 у Wayback Machine.](Python) — php 5.6

Середовища розробки PHP

[ред. | ред. код]

VIM (текстовий редактор)

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

Недоліки PHP

[ред. | ред. код]
  • Незручність дизайну мови[джерело?]
    • Змінні з символом $
    • Складні назви поширених функцій (html_entity_decode, mysql_select_db, nl2br тощо)
    • Не підтримується Unicode у версіях до 6.0
  • Непередбачуваність нових версій PHP.

Критика

[ред. | ред. код]

У статті «PHP: a fractal of bad design [Архівовано 21 квітня 2012 у Wayback Machine.]»[21] представлений докладний і ґрунтовний огляд проблем у дизайні мови програмування PHP. Автор показує винятковість PHP як одної з найбільш неопрацьованих мов, проблеми в якій мають систематичний характер. Зокрема у статті продемонстровані проблеми в самій мові, бібліотеці функцій, структурах, механізмах роботи з даними, екосистемі, засобах зневадження. Вказані недоробки в безпеці, надійності, цілісності та передбачуваності.

Якщо розглядати безпеку, то як приклад спочатку порочної практики наводиться розрізненість засобів для чищення та нормалізації даних перед їхнім використанням у різних операціях, що є прекрасною підмогою для виникнення в застосунках вразливостей, що дозволяють здійснити підстановку SQL-коду або вбудовування JavaScript на сторінку. Згадки також заслуговує підхід «небезпечний за умовчанням», який тільки останнім часом став переглядатися розробниками PHP, наприклад, причиною безлічі вразливостей є використання register_globals і підтримка виконання зовнішнього коду за URL в директиві include. З проблем у самому інтерпретаторі відзначається спроба виправити у 2007 році цілочисельну вразливість через перевірку "if (size > INT_MAX) return NULL;"; помилка в реалізації функції crypt() в PHP 5.3.7 через яку можна було зайти з будь-яким паролем; DoS-уразливість в PHP 5.4, пов'язана з виділенням пам'яті на підставі переданого користувачем значення в HTTP-заголовку Content-Length.

Ліцензія

[ред. | ред. код]

Ліцензія PHP має назву The PHP License[en] version 3.01[22]

ЧАП за цією ліцензією [Архівовано 3 листопада 2015 у Wayback Machine.] та її текст [Архівовано 25 листопада 2005 у Wayback Machine.] можна знайти на офіційному сайті The PHP Group, а також файл із ліцензією містить дистрибутив PHP (звичайно license.txt).

Див. також

[ред. | ред. код]

Примітки

[ред. | ред. код]
  1. PHP 8.3.
  2. Version 8.3.2
  3. PHP 8.3.0 RC 6 available for testing.
  4. а б в PHP: Preface - Manual
  5. Rasmus Lerdorf | PHP on Hormones — 2013.
  6. The php Open Source Project on Open Hub: Languages Page — 2006.
  7. http://php.net/license/
  8. https://fileinfo.com/extension/php
  9. https://www.php.net/manual/en/book.phar.php
  10. Usage statistics of server-side programming languages for websites.
  11. а б в Andi Gutmans, Stig Bakken, Derick Rethans. PHP5 Power Programming. — Prentice Hall, 2005. — 704 с.
  12. The Neverending Muppet Debate of PHP 6 v PHP 7. Архів оригіналу за 19 листопада 2015. Процитовано 27 січня 2019.
  13. RFC: Name of Next Release of PHP. php.net. 7 липня 2014. Архів оригіналу за 3 липня 2017. Процитовано 15 липня 2014.
  14. Re: [PHP-DEV] [VOTE][RFC] Name of Next Release of PHP (again). 30 липня 2014. Архів оригіналу за 24 липня 2018. Процитовано 30 липня 2014.
  15. PHP 7 ChangeLog:Version 7.0.0. Архів оригіналу за 22 квітня 2021. Процитовано 22 квітня 2021.
  16. Migrating from PHP 5.6.x to PHP 7.0.x. Архів оригіналу за 22 квітня 2021. Процитовано 22 квітня 2021.
  17. PHP 7: Features and Performance Comparison. Архів оригіналу за 12 квітня 2021. Процитовано 22 квітня 2021.
  18. PHP 8.0.0 Released!. Архів оригіналу за 13 жовтня 2020. Процитовано 4 травня 2021.
  19. PHP 8.0.0 Release Announcement. Архів оригіналу за 3 травня 2021. Процитовано 4 травня 2021.
  20. PHP Language Manual: Type Juggling. Архів оригіналу за 20 жовтня 2007. Процитовано 26 жовтня 2007.
  21. Російський переклад: PHP: фрактал плохого дизайна [Архівовано 19 квітня 2012 у Wayback Machine.]
  22. (англ.)The PHP License, version 3.01 [Архівовано 22 травня 2020 у Wayback Machine.]

Посилання

[ред. | ред. код]