Каковы преимущества вызовов функций без смешанных переменных?

Я знаю, что PHP — очень устойчивый к ошибкам язык, и я думаю, именно поэтому вы можете иметь смешанные переменные для вызовов функций, таких как:

/**
* @param mixed $bar
**/
function foo($bar) {
// Do something with $bar, but check it's type!
}

Есть ли рекомендуемый способ НЕ используя такие смешанные переменные?

Для моих собственных проектов я стараюсь избегать таких смешанных переменных, просто чтобы потом было меньше проблем с ошибками и для ясности кода.

А в PHP 7 должно быть возможно объявить, какой тип переменной ожидает эта функция, не так ли? Как это сделать?

3

Решение

Это, вероятно, будет закрыто как «основанное на мнении», но это все еще хороший вопрос.

Функция должна делать одну вещь. Если вам нужно сделать это:

if it's a string
do this
else if it's a Foo object
do this other thing

Тогда он делает больше, чем одну вещь, которая является «менее чем идеальной» формой.

Почему бы вам просто не предоставить два хорошо названных метода, например: getThingById(int) а также getThingByFilters(Filters) или же getThingLike(string) так далее? Это также сделает ваш код более читабельным и предсказуемым.

2

Другие решения

Это может быстро стать вопросом мнения, но я чувствую, что свободная типизация открывает больше возможностей для появления ошибок. Могут быть случаи, когда это уместно, но, как правило, для кода, который должен быть надежным и поддерживаемым (возможно, выше «гибкого»), строгая типизация безопаснее.

В 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).

2

По вопросам рекламы [email protected]