PHP 5.3: Основные нововведения

PHP 5.3 — первая крупная модернизация ветки 5.x: пространства имён (namespace, use, полные имена), позднее статическое связывание (static:: вместо жёсткого self::), замыкания с use, ограниченный goto, NOWDOC (heredoc без подстановки переменных), сборщик мусора по желанию для циклических ссылок, архивы Phar и пачка улучшений расширений (mysqlnd, intl, обновления openssl). Параллельно язык ужесточается: передача аргумента по ссылке в месте вызова исчезает, часть привычек из PHP 4 помечена deprecated (ereg*), а новые зарезервированные слова могут сломать старые имена констант.

Ориентир — разделы migration53: новое, несовместимое, устаревшее.

Содержание


Пространства имён

Изолируют код и уменьшают длину префиксов классов: __NAMESPACE__, псевдонимы use, блочный синтаксис namespace — удобно вводить пакеты постепенно, не переписывая монолит за один раз.

Позднее статическое связывание

static:: разрешается в вызываемом классе при наследовании; self:: остаётся привязанным к классу, где метод объявлен. Это лечит типичные «статические хелперы», которые вели себя неправильно на PHP 5.2.

Замыкания и use

Анонимные функции захватывают переменные по значению или по ссылке через список use — основа для колбэков до появления $this в замыканиях в 5.4.

goto, NOWDOC, const вне класса

goto прыгает к метке в пределах функции — применяйте редко. NOWDOC не интерполирует $переменные — удобно для регулярок и shell. const на уровне файла поддерживается в именованных пространствах.

Сборка мусора для циклов

gc_enable / gc_disable / gc_collect_cycles помогают возвращать память при циклических ссылках между объектами — актуально для долгоживущих процессов и тяжёлых ORM-сценариев.

Phar, intl, драйверы

Пример объявления namespace и use:

namespace App\Model;

use App\Db\Connection;

class UserRepository
{
    /** @var Connection */
    private $db;

    public function __construct(Connection $db)
    {
        $this->db = $db;
    }
}

Phar упаковывает приложение в один архив. intl даёт форматирование через ICU. mysqlnd — нативный драйвер для mysql/mysqli/PDO_mysql при соответствующей сборке. Полный список — migration53 new-features.

Практические рецепты

Переводите ereg* на preg_* с разделителями. Вводите namespace по модулям: новые файлы с use, старые точки входа — последними.

Обратная несовместимость

Ключевое (migration53 incompatible): новые ключевые слова ломают незакавыченные «константы»; call-time pass-by-reference удалён; часть функций mysql помечена deprecated — готовьте mysqli/PDO; на Windows могли исчезнуть отдельные SAPI (например ISAPI) — переходите на поддерживаемые варианты.

Deprecated

ereg*, старый SQLite2, mime_magic в пользу fileinfo — см. migration53 deprecated.

Прочие замечания

Не опирайтесь на safe_mode как на модель безопасности. После обновления пакетов проверьте INI и список подключаемых расширений.


Итог

PHP 5.3 — старт современной раскладки кода: пространства имён и замыкания меняют архитектуру. Уберите ereg* и call-time references — тогда переходы на 5.4+ и далее к PHP 7 будут заметно проще.

<|tool▁calls▁begin|><|tool▁call▁begin|> StrReplace