Я знаю, что PHP — очень устойчивый к ошибкам язык, и я думаю, именно поэтому вы можете иметь смешанные переменные для вызовов функций, таких как:
/**
* @param mixed $bar
**/
function foo($bar) {
// Do something with $bar, but check it's type!
}
Есть ли рекомендуемый способ НЕ используя такие смешанные переменные?
Для моих собственных проектов я стараюсь избегать таких смешанных переменных, просто чтобы потом было меньше проблем с ошибками и для ясности кода.
А в PHP 7 должно быть возможно объявить, какой тип переменной ожидает эта функция, не так ли? Как это сделать?
Это, вероятно, будет закрыто как «основанное на мнении», но это все еще хороший вопрос.
Функция должна делать одну вещь. Если вам нужно сделать это:
if it's a string
do this
else if it's a Foo object
do this other thing
Тогда он делает больше, чем одну вещь, которая является «менее чем идеальной» формой.
Почему бы вам просто не предоставить два хорошо названных метода, например: getThingById(int)
а также getThingByFilters(Filters)
или же getThingLike(string)
так далее? Это также сделает ваш код более читабельным и предсказуемым.
Это может быстро стать вопросом мнения, но я чувствую, что свободная типизация открывает больше возможностей для появления ошибок. Могут быть случаи, когда это уместно, но, как правило, для кода, который должен быть надежным и поддерживаемым (возможно, выше «гибкого»), строгая типизация безопаснее.
В PHP 5 есть «подсказка типа»:
Начиная с PHP 5.0, вы можете использовать имена классов или интерфейсов в качестве подсказки типа, или self
:
<?php
function testFunction(User $user) {
// `$user` must be a User() object.
}
Начиная с PHP 5.1, вы также можете использовать array
как подсказка типа:
<?php
function getSortedArray(array $array) {
// $user must be an array
}
PHP 5.4 добавляет callable
для функций / замыканий.
<?php
function openWithCallback(callable $callback) {
// $callback must be an callable/function
}
Начиная с PHP 7.0, скалярные типы можно использовать также (int
, string
, bool
, float
):
<?php
function addToLedger(string $item, int $quantity, bool $confirmed, float $price) {
...
}
Начиная с PHP 7, теперь это называется Тип объявления.
PHP 7 также вводит Объявления возвращаемых типов, позволяя вам указать, какой тип возвращает функция. Эта функция должен вернуть float
:
<?php
function sum($a, $b): float {
return $a + $b;
}
Если вы не используете PHP7, вы можете использовать доступные подсказки типов и заполнить оставшиеся пробелы соответствующими PHPDoc документация:
<?php
/**
* Generates a random string of the specified length, composed of upper-
* and lower-case letters and numbers.
*
* @param int $length Number of characters to return.
* @return string Random string of $length characters.
*/
public function generateRandomString($length)
{
// ...
return $randomString;
}
Многие редакторы могут анализировать эти комментарии и предупреждать вас о неправильной печати (например, PHPStorm).