Пространства имен
Самым большим изменением в PHP 5.3, несомненно, являются пространства имен (ранее был соответствующий FAQ по пространствам имен PHP). Это приносит много преимуществ разработчикам PHP, а также решена широко критикуемая проблема именования функций.
Код стал более понятным
Общий код версий до 5.3 требует специального префикса для различения имен функций и классов. ОБЫЧНЫЙ
ТЕКСТОВЫЙ
КОД:
function MY_wrapper() {}
класс MY_DB { }
define('MY_CONN_STR', '');
МОЯ_обертка();
новый MY_DB();
МОЙ_CONN_STR;
После использования пространств имен код выглядит чище.
ОБЫЧНЫЙ ТЕКСТОВЫЙ
КОД:
пространство имен MY;
функция-обертка() {}
класс БД { }
const CONN_STR = '';
используйте МОЙ КАК МОЙ;
оболочка();
новая БД();
КОНН_СТР;
Несколько пространств имен, определенных в одном файле
Что делать, если в файле определено несколько пространств имен?
ОБЫЧНЫЙ ТЕКСТОВЫЙ
КОД:
пространство имен LIB;
класс MySQL {}
класс SQLite {}
$b = новый SQLite();
пространство имен LIB_EXTRA;
класс MScrypt {}
$а = новый MScrypt();
var_dump(
get_class($а),
get_class($b)
);
Вывод приведенного выше кода:
ОБЫЧНЫЙ ТЕКСТОВЫЙ
КОД:
string(18)"LIB_EXTRA::MScrypt"
строка(11)"LIB::SQLite"
PHP — это язык интерпретации и выполнения, и приведенные выше результаты вполне обоснованы.
приоритет пространства имен
Функции, классы и константы, определенные в пространстве имен, имеют приоритет, за ними следуют глобальные.
ОБЫЧНЫЙ ТЕКСТОВЫЙ
КОД:
пространство имен foo;
функция strlen($foo) { return htmlentities($foo });
echo strlen("тест"); // тест
echo ::strlen("тест"); // 4
echo namespace::strlen("test"); // тест
Дружба между пространством имен и автозагрузкой
autoload будет анализировать местоположение файла класса на основе имени пространства имен и имени класса. Автозагрузка будет запускаться только в том случае, если определение класса не найдено в пространстве имен, и глобальная область видимости не будет автоматически вызываться.
ОБЫЧНЫЙ ТЕКСТ
КОД:
функция __autoload($var) { var_dump($var } // LIB::foo);
требуется "./ns.php" /*;
<?php
пространство имен LIB;
новый Фу();
*/
пространство имен некоторые аксессуары
ОБЫЧНЫЙ ТЕКСТОВЫЙ
КОД:
пространство имен действительно::long:: бессмысленно:: verbose::ns;
__NAMESPACE__ // Новая магическая константа, представляющая текущее имя пространства имен;
класс а {}
get_class(new a()); // действительно::long:: бессмысленно::verbose::ns::a
используйте Really::long::pointless::verbose::ns::a AS b;// Ссылка на класс из пространства имен Примечание. Содержимое здесь взято из слайдов pdfIntroduction к PHP 5.3 и не будет повторяться позже.
Улучшения производительности
Общая производительность php 5.3 улучшилась на 5-15%
, а md5() стал быстрее на 10-15%.
Улучшенная реализация стека в движке
Константы перемещены в постоянную память
Улучшение процесса обработки исключений (упрощение, меньше кодов операций)
(требовать/включить)_после улучшения удалить дубликат, открыть
Меньший двоичный размер и размер запуска с gcc4
Новая языковая функция__DIR__
До версии 5.3 для получения каталога текущего скрипта требовался вызов функции
: ОБЫЧНЫЙ ТЕКСТОВЫЙ
КОД:
echo dirname(__FILE__); // < PHP 5.3;
В версии 5.3 нужна только одна магическая константа __DIR__.
ОБЫЧНЫЙ ТЕКСТОВЫЙ
КОД:
echo __DIR__ // >= PHP 5.3;
?:Оператор Удобный оператор ?:может быстро получить ненулевое значение из двух значений/выражений.
ОБЫЧНЫЙ ТЕКСТОВЫЙ
КОД:
$a = true ?: false // true;
$а = ложь ?: правда // правда;
$а = "" ?: 1 // 1;
$а = 0 ?: 2; // 2;
$a = массив() ?: массив(1); // массив(1);
$a = strlen("") ?: strlen("a"); // 1
__callStatic()
Добавлен новый магический метод __callStatic. Его функция аналогична __call, но действительна только для статических методов.
ОБЫЧНЫЙ ТЕКСТОВЫЙ
КОД:
помощник класса {
статическая функция __callStatic($name, $args) {
echo $name.'('.implode(',', $args).')';
}
}
helper::test("foo","bar" // тест(foo,bar)
Динамически вызывать статический метод. Динамически вызывать статический метод? Сочетание движения и неподвижности.
ОБЫЧНЫЙ ТЕКСТОВЫЙ
КОД:
помощник класса {
статическая функция foo() { echo __METHOD__ }
}
$а = "помощник";
$b = "фу";
$a::$b() // помощник::foo
Позднее статическое связывание
Не знаю, как это перевести, возможно, будет проще понять, если я оставлю оригинальный текст. Изменилось время обработки событий статических методов. Раньше оно обрабатывалось во время компиляции, но теперь оно обрабатывается во время выполнения.
До PHP 5.3 следующий код выдавал A, но это не то, что нам нужно. Метод whoami был переопределен в классе B. Он должен выводить B, чтобы соответствовать тому, что мы считаем само собой разумеющимся.
ОБЫЧНЫЙ ТЕКСТОВЫЙ
КОД:
класс A {
публичная статическая функция whoami() {
эхо __CLASS__;
}
публичная статическая функция идентификации() {
сам:: whoami();
}
}
класс B расширяет A {
публичная статическая функция whoami() {
эхо __CLASS__;
}
}
B::identity(); // A <-- PHP <5.3
Следующий код использует static::whoami() для вызова статических методов. После PHP 5.3, поскольку __CLASS__ обрабатывается во время выполнения, в этом примере можно успешно перехватить класс B.
ОБЫЧНЫЙ ТЕКСТОВЫЙ
КОД:
класс A {
публичная статическая функция whoami() {
эхо __CLASS__;
}
публичная статическая функция идентификации() {
статический:: whoami();
}
}
класс B расширяет A {
публичная статическая функция whoami() {
эхо __CLASS__;
}
}
B::identity(); // B <-->= PHP 5.3
mysqlnd
Обратите внимание, что mysqlnd стал драйвером MySQL по умолчанию в PHP 5.3
, но PDO_MySQL еще не поддерживает mysqlnd. В настоящее время только расширение mysql(i) может использовать
новые функции PHP 5.3, представленные ранее, которые удобны для разработчиков. Вот функция, которая очень нравится провайдерам веб-хостинга.
Расширенная поддержка INI-файлов.
CGI/FastCGI поддерживает конфигурацию INI, аналогичную .htaccess. Каждый каталог может иметь настройки INI. Имя файла ini зависит от конфигурации php.ini, но [PATH=/var/www/domain.com], [HOST=www. Настройки раздела .domain.com] не могут быть изменены пользователем.
Улучшенная обработка ошибок
Переменные и константы можно определять в ini-файлах и вызывать непосредственно в программе.
Прикреплен пример INI-файла.
ОБЫЧНЫЙ ТЕКСТОВЫЙ
КОД:
#Определенное пользователем имя файла php.ini (.htaccess). По умолчанию используется «.user.ini».
user_ini.filename=".user.ini"
#Если вы хотите отключить эту функцию, установите для нее нулевое значение.
user_ini.имя_файла=
#Определенная пользователем длина TTL файла php.ini (время жизни), единица измерения — секунды, я понимаю это время истечения срока действия кэша. По умолчанию – 300 секунд.
user_ini.cache_ttl=300
[ПУТЬ=/var/www/domain.com]
переменные_order = GPC
безопасный_режим = 1
[мои переменные]
совар = "1234"
другая переменная = $ {некоторая переменная}; другая переменная == некоторая переменная;
[ini-массивы]
фу[бар]=1
фу[123]=2
фу[]=3