Найти в Дзене
ZDG

Языки программирования 8: PHP

Оглавление

С самого начала PHP считался языком, на котором грязно кодят веб-странички. И для того были некоторые основания.

Предыдущая часть:

Принцип использования заключался в том, что мы берём страницу с HTML-кодом и вставляем в неё инструкцию на PHP, например так:

<html><body><?php echo 'Hello world' ?></body></html>

Для того, чтобы отличать инструкции PHP от HTML-кода, требовалось помещать их внутрь специального тэга <?php ?>.

Поэтому PHP не мыслился вне веб-страниц, да и расшифровка его названия "Personal Home Page" или "PHP: Hypertext Preprocessor" (да, оно рекурсивное) говорила сама за себя. Страницы же превращались в адскую кашу, состоящую из HTML и PHP-тэгов с инструкциями.

Но ничто и никогда не мешало написать совершенно отдельную и самостоятельную программу, которая ничего общего с вебом не имеет и никаким препроцессингом гипертекста не занимается. Она, правда, всё равно должна начинаться с тэга:

<?php
echo "Hello world";

Интересно, что почти любой произвольный текст является рабочей программой на PHP. Например, если написать просто Hello World, то эта программа будет работать и выведет Hello World:

Происходит это потому, что всё, что находится вне php-тэгов, напрямую попадает в выходной поток. Равносильно тому, как если бы мы использовали инструкцию echo для всего этого текста.

Версии

PHP развивался и обрастал новыми возможностями. Версии 3 и 4 это как раз те, которые создали ему печальную славу языка говнокодеров. Версия примерно 5.6 превратила его в более-менее нормальный язык с вменяемым ООП. Затем последовала версия 7 с существенными оптимизациями и типизацией (необязательной), и наконец, на данный момент актуальна версия 8 с более тонкими изменениями. Однако, как и все языки с запоздалыми додумками и доделками, он также вынужден поддерживать часть старого и плохого наследства. Оно заключается в наличии разных функций, которые делают одно и то же, в несоблюдении единого порядка аргументов для функций, в устаревших расширениях и т.д.

Применение

PHP – серверный язык, и поэтому всё ещё имеет предназначение для создания веб-страниц. Да, на нём по-прежнему можно говнокодить, но это уже зависит лишь от квалификации программиста.

Теперь это просто универсальный бэкэнд, который может выполнять любые задачи, например обслуживать многопользовательскую игру или обрабатывать банковские документы. Естественным ограничением является то, что на PHP нельзя сделать графический пользовательский интерфейс. У него нет таких понятий, как экран или мышка, только ввод и вывод.

Переменные

Переменные, как в Perl, обозначаются знаком $:

$a = 5;

Но в Perl это оправданно, так как есть ещё знаки @ и %, обозначающие массив и хэш. В PHP же ничего такого нет, есть только $, и никакой роли он не играет. Разве что имя переменной можно использовать при выводе прямо в строке:

echo "a = $a";

Типы данных

Изначально PHP не типизированный язык, и более того, в операциях он не различает чистые числа и числа, записанные в виде строки. Например, это условие сработает:

-2

Причина проста. Опять же говоря о веб-страницах, мы получаем разнообразные данные из веб-форм, например год рождения пользователя, что является числом, но приходит всегда в виде строки. Поэтому PHP просто не тратит силы программиста на преобразования, и если строка содержит только цифры, значит она эквивалентна такому же числу. Её можно умножать, делить и т.д.

Однако строка по-прежнему остаётся строкой, а число числом. Если мы напишем так:

-3

то увидим, что строка $a это по сути символьный массив, у которого можно получить элемент с индексом 1, который равен '2'.

Переменная $b это число, поэтому у него нельзя получить элемент с индексом 1, но и ошибки это не вызовет. Раз такого свойства не существует, то результатом будет просто пустое значение. И попробуйте потом найти, где ошибка, да (в принципе можно настроить, чтобы выдавались предупреждения).

Чтобы избежать путаницы между строками и числами, нужно использовать знак "сильного равенства", или идентичности:

-4

В этом случае условие уже не сработает.

Коллекции в PHP представлены ровно одним типом. Это массив, который выглядит как массив, но на самом деле хэшмап. Стандартные индексы 0, 1, 2, ... являются не просто индексами, как нам может показаться, а именно ключами. С ними можно делать всё, что обычно делается: проверять наличие, добавлять, удалять.

Например, вот так мы можем создать массив из 10 элементов, добавляя по одному в конец:

-5

При этом каждому элементу будет автоматически присвоен индекс по порядку. Получится как бы стандартный массив. Но так как индексы это ключи, мы можем удалить из массива любой ключ:

unset($a[2]);

и добавить любой:

$a['hello'] = 'world';

Поэтому ассоциативные массивы в PHP – универсальный и достаточно быстрый инструмент для многих задач. К ним прилагается множество функций, которые делают самые разные операции с массивами, типа сортировки, объединения, пересечения и т.д.

Однако надо проявлять осторожность с ключами типа 5 и "5" – хотя это число и строка, и следовательно разные ключи, PHP будет считать их одинаковыми по вышеописанным причинам. Трудно сосчитать, сколько программистов на этом погорело.

В остальном PHP вполне обычный язык, с обычным C-подобным синтаксисом, с функциями и т.д. На нём можно писать в такой же манере, как например на C, но можно и как на Java, используя чистое ООП. Всё зависит исключительно от подхода и прямизны рук программиста.

Заключение

  • Язык с плохой репутацией, но уже перерос её
  • Только для бэкенда, и хорошо заточен под веб
  • Нюансы приведения типов приводят к труднообнаружимым ошибкам, но за типами программист может следить более строго, если сам захочет
  • Ассоциативные массивы – универсальное решение

Читайте дальше: