Начиная с PHP 5, вы можете использовать подсказку типа, чтобы указать ожидаемый тип данных аргумента в объявлении функции. Когда вы вызываете функцию, PHP проверит, имеют ли аргументы заданный тип. Если нет, время выполнения вызовет ошибку и выполнение будет остановлено.
Допустимые типы — это имена классов для аргументов, которые получают объекты, и массив для тех, которые получают массивы. Вот пример:
<?php
function enroll(Student $student, School $school) {
echo "Enrolling " . $student->name . " in " . $school->name;
}
Точно сообщая PHP, какие объекты ожидает метод enroll()
Точно так же вы знаете, что у вас не будет никаких упрямых пахидерм, появляющихся в первый день третьего класса.
Что произойдет, если я попытаюсь поступить в Medicare?
<?php
$me = new Student("Amanda");
$medicare = new Program("Medicare");
$enroll = enroll($me, $medicare);
Несмотря на то, что я студент, произойдет следующая ошибка:
Исправляемая фатальная ошибка: Аргумент 2, передаваемый в enroll (), должен быть экземпляром School, экземпляром Program, который вызывается в typehint.php в строке 32 и определяется в typehint.php в строке 6
Если
<?php
function startParty(array $guests, array $food = null) {
// party stuff...
}
$guests = array("Susan Foreman", "Sarah Jane Smith", "Rose Tyler", "Donna Noble");
startParty($guests, null);
Там будет вечеринка, пока есть гости, с едой или без.
Ограничения хинтинга
Любой определенный класс может быть допустимой подсказкой типа, хотя PHP не поддерживает подсказки типа для универсального объекта. А как насчет всего остального?
Вот своеобразный пример ограничений хинтинга типов в PHP:
<?php
function stringTest(string $string) {
echo $string;
}
stringTest("definitely a string");
Исправляемая фатальная ошибка: аргумент 1, передаваемый в stringTest (), должен быть экземпляром строки, заданной строки, вызванной в typehint.php в строке 42 и определенной в typehint.php в строке 39
Вы не первый думаете: «Что это за безумие? Я дал вам экземпляр строки, и все же вы жалуетесь, что это должен быть экземпляр строки! »Все в порядке. Это случается с лучшими из нас. На самом деле, это может быть довольно
сбивающее с толку сообщение об ошибке на первый взгляд.
stringTest()
string
Скалярные типы данных, такие как строки или целочисленные значения, не поддерживаются в подсказках типа PHP. Но это нормально! Если вам нужно вызвать ошибку или выдать исключение, когда аргумент не является скалярным типом (например, строка или целое число), вы можете выполнить базовую проверку для этой цели, используя такие функции, как is_string()
is_int()
Скалярные войны
Было немного противоречий относительно добавления скалярной подсказки типа PHP в PHP 5.4. Те, кто выступает против изменений, утверждают, что эта поддержка будет идти против фундаментальных конструкций PHP. PHP считается слабым типизированным языком. По сути, это означает, что PHP не требует, чтобы вы объявляли типы данных. С переменными по-прежнему связаны типы данных, но вы можете делать радикальные вещи, такие как добавление строки к целому числу, не приводя к ошибке.
В мае 2010 года в транк PHP была добавлена поддержка хинтинга скалярного типа. Но из-за реакции сообщества эта функция не появится в версии 5.4.
Резюме
Подсказка типов — это методика, введенная в PHP для объектно-ориентированного программирования (особенно для определения типа перехваченного исключения). Я рекомендую вам прочитать больше о работе с объектами здесь.
Изображение через Карлоса Е. Санта-Мария / Shutterstock