2016-05-30 2 views
3

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

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

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

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

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

+0

Мы можем добавить тип к функции foo (array $ bar) {// $ bar должен быть массивом} – vijaykumar

+0

@vijaykumar, но это работает только с PHP 7, правильно? – Jurik

+0

Проверка типов хороша для целого множества причин, и использование интерпретатора для этого (а не вручную), когда вы можете, всегда лучше. Но всегда будут случаи, когда код может быть более чистым со смешанными переменными, чем с сильной типизацией. – Kittsil

ответ

2

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

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

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

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

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

+0

Я думаю, что в случае хорошего качества кода вы не можете видеть это как вопрос, основанный на мнениях. Конечно, хороший и плохой код может выводить одинаковый правильный результат, но у него есть еще много преимуществ ... – Jurik

+0

Кто говорит, что функция должна делать одно? Наверное, это и есть истинный ответ. – Jurik

+0

У Боба Мартина, возможно, есть что сказать об этом в отношении чистого кода (читайте его книгу по теме: это золото), но я думаю, что это просто «получившая мудрость»? Я слышал, что многие люди поддерживают его (я всегда буду, когда я просматриваю код), и я никогда не слышал и не читал о том, чтобы кто-нибудь представлял убедительный случай, который его сдерживает. Конечно, все должно быть измерено с «это зависит», но для этого вопроса прямо здесь, я думаю, что это правильный совет. Ты не? –

2

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

PHP 5 имеет "типа намекая":

В РНР 5.0, вы можете использовать имена классов или интерфейсов в качестве типа намек, или self:

<?php 
function testFunction(User $user) { 
    // `$user` must be a User() object. 
} 

В РНР 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 
} 

В РНР 7.0, скалярные типы могут быть также использованы (int, string, bool, float):

<?php 
function addToLedger(string $item, int $quantity, bool $confirmed, float $price) { 
    ... 
} 

В РНР 7, теперь это называется Type Declaration.

PHP 7 также вводит Return Type Declarations, позволяя указать тип возвращаемого значения функции. Эта функция должна возвращать float:

<?php 
function sum($a, $b): float { 
    return $a + $b; 
} 

Если вы не используете PHP7, вы можете использовать подсказки типа, которые доступны, и заполнить оставшиеся пробелы с правильной PHPDoc documentation:

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

+0

Строгая типизация также открывает ваш код для ошибок, просто разные ошибки. Спросите ESA о своей ракете Arianne 5, рейсе 501 и конверсиях с 64-битной плавающей точкой в ​​16-битное целое число со знаком ;-) –

+0

Я согласен с этим. Но тем более в PHP. Типы просты; нет размеров. – Will

Смежные вопросы