Это плохая идея называть такие параметры в PHP? - PullRequest
3 голосов
/ 30 апреля 2011

В последнее время я много занимался программированием на Objective-C, и теперь, когда я возвращаюсь к PHP, я должен быть честным, я скучаю по названным параметрам (сначала я ненавидел их, теперь я их люблю иди разберись).

Во всяком случае, в PHP я иногда вижу, как люди передают массивы в функции как псевдо-способ именования параметров (с дополнительным преимуществом - не нужно беспокоиться о порядке), но иногда это усложняет написание функций. Кроме того, иногда я хочу вызвать функцию с именованными параметрами, но иногда это проще и быстрее не делать.

Кто-нибудь просто делает что-то вроде этого:

function calculateArea( $width, $height ) {
    // do calculations here...
}

// and then call the function like so:
calculateArea( $width = 10, $height = 5 );

Кажется, это работает нормально, по крайней мере, с моей версией PHP, и мне интересно, используют ли другие люди эту технику в качестве обходного пути для именованных параметров. Мне также интересно, знает ли кто-нибудь о каких-то веских причинах, почему я не должен этого делать.

Спасибо!

UPDATE:

Спасибо за все быстрые ответы всем. Чтобы прояснить ситуацию, позвольте мне сказать, что я понимаю, что передача ассоциативного массива является лучшим вариантом в большинстве сценариев, но иногда вы работаете с функциями, которые вы уже написали, и не хотите менять способ их вызывается в каждой части вашего кода. Также иногда вы работаете со вторичной платформой и не можете контролировать, как была написана функция.

Если я смотрю на код, который я написал год назад, и вижу: echo $zc->expand('Foo', 'Bar', 10, 1, 0, null, null, array('class'=>'code'), false);, это не очень полезно.

Итак, перефразируя мой вопрос, я в основном спрашиваю:
Иногда передача аргументов функции через присваивание легче для чтения. Каковы недостатки этого, и будет ли это работать во всех версиях PHP?

Ответы [ 5 ]

4 голосов
/ 30 апреля 2011

При использовании calculateArea( $width = 10, $height = 5 ) вы не указываете параметры по их именам, как это можно сделать на других языках, таких как Python .

Вместо $width = 10 и $height = 5 в функцииcall - это всего лишь две переменные выражения присваивания .

Причина, по которой это все еще работает, как и ожидалось, заключается в том, что выражение присваивания не просто присваивает значение, но и возвращает присвоенное значение:

Значением выражения присваивания является присвоенное значение.То есть значение "$a = 3" равно 3.

Таким образом, фактически calculateArea( $width = 10, $height = 5 ) вызывает calculateArea с теми же параметрами, что и calculateArea(10, 5), но также назначает две переменные:

calculateArea( $width = 10, $height = 5 );
var_dump($width);   // int(10)
var_dump($height);  // int(5)
4 голосов
/ 30 апреля 2011

Я думаю, что это плохая идея с точки зрения того, что у вас нет никакой безопасности, если вы ошибаетесь в заказе.Использование карты - намного более безопасный способ подражать этому.У вас также есть побочный эффект установки значений этих переменных в локальной области, что может быть или не быть проблемой.

calculateArea( $height = 5, $width = 10 ); # oops!

function calculateArea( $width, $height ) {
    // do calculations here...
}

С массивом (картой) не имеет значения, в каком порядкеВы кладете их.

calculateArea( array( 'height' => 5, 'width' => 10 ) ) # yea!

function calculateArea( $dimensions ) {
    $width = $dimensions['width'];
    $height = $dimensions['height'];
}
2 голосов
/ 30 апреля 2011

Вы не должны использовать назначения переменных в вызовах функций, потому что это может привести к неожиданным результатам. calculateArea($a = 10, $b = 5) тоже работает. После завершения этого вызова функции $ a === 10 и $ b === 5. Если эти переменные имели разные значения перед вызовом функции, эти значения переопределяются.

0 голосов
/ 01 мая 2011

Ну, теперь вы знаете, что в PHP нет этой функции.Но я хочу сказать, что передача массива тоже плохой путь.Таким образом, вы должны сохранить в памяти (или в комментарии phddoc в лучшем случае), какие ключи можно использовать в массиве, вы не можете установить «значение по умолчанию», и вы можете легко сделать опечатку в имени ключа массива.
Поэтому я предпочитаю использовать объекты для этого случая (поскольку в PHP тоже нет «структур»).В объекте вы можете установить значения по умолчанию, вы можете установить тип необходимого объекта в объявлении функции, а в IDE вы можете получить полный код для имен полей объекта.Например:

class DimensionsParams
{
    public $width = 5;
    public $height;
}

function calculateArea(DimensionsParams $params)
{
    // do calculations here...
    return $params->height*$params->width;
}

Конечно, это не лучший выбор для каждой функции, но это лучший вариант для «именованных параметров» (на мой взгляд).

0 голосов
/ 30 апреля 2011

Вы можете вызывать свою функцию любым из следующих способов:

calcArea (10,5);

или это:

CalculateArea ($ width, $ height);

или это:

CalculateArea ($ xvar, 5);

Но присваивание значений внутри вызова функции обычно является плохой практикой.Это технически правильно, но делает код трудным для чтения.Вместо этого:

Рассчитать площадь ($ ширина = 10, $ высота = 5);

Сделайте это:

$width = 10;
$height = 5;
calculateArea( $width, $height );

Или вот это:

$width = 10;
$height = 5;
calculateArea( 10, 5 );

Все они имеют одинаковый эффект, но объявление переменных вне функции проясняет их область действия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...