function get_tags_by_criteria($gender="%", $min_age_of_birth="%", $max_age_of_birth="%", $country="%", $region="%", $city="%", $tag="") {
когда я просто хочу передать аргумент тега и пусть остальные по умолчанию, как я пишу?
ive попробовал это, но он не работал.
get_tags_by_criteria("", "", "", "", "", "", computer);
Вы можете моделировать именованные аргументы с помощью ассоциативного массива:
function my_function($options) { extract($options); }
затем позвоните
my_function(array("parameter1" => "value1", "parameter2" => "value2"));
что в сочетании с надежной проверкой и таблицей значений по умолчанию внутри функции отлично работает для меня.
Недостаток: для документирования аргументов нет соглашения phpDoc, и ваша IDE не сможет отображать доступные аргументы для вас по мере ввода. Вам нужно будет ввести доступные параметры в блок @desc
который, в зависимости от вашей среды разработки, может выглядеть или не выглядеть красиво.
Один из способов решения этой проблемы – объявить все параметры в функции, но сделать все из них, кроме первого, необязательным. Первый из них может быть ассоциативным массивом, содержащим значения.
Сначала поставьте аргумент тега:
function get_tags_by_criteria($tag="", $gender="%", $min_age_of_birth="%", $max_age_of_birth="%", $country="%", $region="%", $city="%")
И назовите это так:
get_tags_by_criteria(computer);
В PHP нет именованного параметра. Обычно, если у вас более 4 параметров, и многие из них являются необязательными, вы можете использовать вместо этого массив или объект:
function get_tags_by_criteria($args) { ... } get_tags_by_criteria(array('gender' => 'M', 'tag' => 'php'));
Вы можете явно задать параметры, разрешенные с помощью объекта.
К сожалению, вы не можете этого сделать – неопределенные необязательные аргументы всегда должны быть в конце списка аргументов функции. Вместо этого вы можете использовать NULL для аргументов, которые вы не хотите указывать, а затем проверить свою функцию, чтобы увидеть, является ли аргумент NULL и назначить ему значение по умолчанию.
Это просто невозможно в PHP.
Структура CakePHP часто использует ассоциативные массивы для указания набора параметров. Это позволит вам указать либо отдельные параметры, либо ассоциативный массив. См. Методы поиска в классе модели в качестве примера.
Вот моя попытка сделать вашу функцию более гибкой:
<?php function get_tags_by_criteria( $gender = '%', $min_age_of_birth = '%', $max_age_of_birth = '%', $country = '%', $region = '%', $city = '%', $tag = '') { if (is_array($gender)) { $options = $gender; $gender = '%'; // reset to default extract($options); } $msg = "gender=$gender, min_age=$min_age_of_birth, " . "max_age=$max_age_of_birth, country=$country, region=$region, " . "city=$city, tag=$tag"; return $msg; } ?> <p><?php echo get_tags_by_criteria('M'); ?></p> <p><?php echo get_tags_by_criteria('M', 10); ?></p> <p><?php echo get_tags_by_criteria(array( 'country' => 'ca', 'tag' => 'sample')); ?></p>