Что именно передается в качестве аргументов функциям PHP?

#php

#php

Вопрос:

После нескольких месяцев попыток разобраться в фреймворках PHP, переходя от одного к другому с базовыми знаниями php, я решил покончить с фреймворками и вернуться к книгам по php и учиться с нуля, чтобы в ближайшем будущем я мог начать создавать свой веб-сайт в стиле mvc без необходимости изучать какой-либо другой фреймворк, который был бы заброшен при выходе более новой версии.

В любом случае, я приобрел книгу по изучению PHP, MySQL и Javascript от Orely Media, практиковался и нахожу это очень интересным.

ОДНАКО…

Я пытаюсь разобраться в этом:

 <?php

echo name_fixer("WILLIAM", "henry", "gAtEs");

function name_fixer($name1, $name2, $name3) {
    $name1 = ucfirst(strtolower($name1));
    $name2 = ucfirst(strtolower($name2));
    $name3 = ucfirst(strtolower($name3));

    return $name1 . " " . $name2 . " " . $name3;
} 
  

У меня есть идея, что происходит, но мой вопрос в том, когда функция вызывается / повторяется, передаются ли в функцию имена, которые я передаю в качестве аргументов?

Я хотел бы точно знать, что происходит. По какой-то причине это пока единственная часть книги, где автор не вдавался в подробности о том, что именно происходит.

Я был бы очень признателен за подробное объяснение, которое позволит мне перейти к следующей части книги.

Ответ №1:

Да, имена, которые вы передаете в качестве аргументов, передаются в функцию.

 myFunction ('a','b'); // call myFunction, passing 2 values

// function receives 2 values
function myFunction($argument1, $argument2) { // <-- function declaration
  echo $argument1 . "<br/>";
  echo $argument2 . "<br/>";
}
  

Идея заключается в том, что вы передаете значения функции, а затем эти значения помещаются в переменные, которые вы указываете в объявлении аргументов функции.

Вы можете называть свои переменные-аргументы как угодно, поэтому они не обязательно должны быть $argument1 или как угодно еще. Им присваиваются значения в том же порядке, что и переданным, поэтому ‘a’ присваивается $argument1, а ‘b’ присваивается $argument2.

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

Комментарии:

1. Вы повторяете $ argument1 дважды, не знаю, хотели ли вы это сделать

2. Итак, поскольку я передаю значения в качестве аргументов, и у них есть предшествующее состояние, например, «WILLIAM», «henry», «GaTe», они не передаются обратно в браузер таким образом. Они повторяются и отображаются так, как вы ожидаете от них после применения функций strtolower, ucfirst. Значит ли это, что значения передаются в функцию в качестве аргументов, а затем возвращаются обратно?

3. Поскольку вы передаете статические значения непосредственно в функцию, нет ссылки, указателя или переменной, на которые можно ссылаться для этих исходных значений. Но, тем не менее, вы работаете с копиями значений. Копии значений обрабатываются, а затем эти измененные значения возвращаются туда, где вы их вызвали, и что бы вы ни делали с этими значениями оттуда, не имеет ничего общего с тем, что происходило внутри функции, не привязано к $argument1 .

4. Строка возврата — это то, что передает обработанные переменные обратно в команду echo. Когда вы выполняете функцию echo(), команда echo будет отображать все, что возвращает функция. Та же концепция для $var = function(), значение $ var будет установлено на любое значение, возвращаемое функцией ().

5. Идеальный.. теперь это понятно на 100%. Большое спасибо. Я вставлю эти последние два абзаца в качестве комментария в свой код на случай, если забуду.

Ответ №2:

Первая строка вызывает name_fixer имя, отчество и фамилию, затем выводит результат функции. name_fixer принимает три имени в качестве аргументов и выполняет следующие действия с каждым:

Преобразует имя в нижний регистр: strtolower("WeeEeeEE") = "weeeeeee"

Первая буква пишется с заглавной буквы: ucwords("weeeeeee") = "Weeeeeee"

Затем функция возвращает единственную строку, содержащую три фиксированных имени, разделенных пробелами.

Комментарии:

1. Да, я понимаю, что делают эти функции, например, strtolower, ucwords и т.д., Но я хотел знать, передаются ли эти имена в функцию через аргументы и обрабатываются ли? или, если переменные передаются из функции и влияют на то, что когда-либо было в аргументах отраженной функции. Если это вообще имеет смысл,.

2. Переменные $name1 , $name2 , … определяются только внутри функции. В первой строке вы передаете «WILLIAM», «henry» и «gAtEs» в качестве аргументов функции. Затем внутри функции $name1 получает значение «WILLIAM», $name2 получает значение «henry» .etc

3. Чего я не понимаю, так это того, как правильно обработанные значения передаются обратно в браузер с использованием этого echo name_fixer(«WILLIAM», «henry», «gAtEs»). Старые значения все еще там, так как же это работает?

Ответ №3:

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

 function fixName($name)
{
    $fixedName = ucfirst(strtolower($name));

    return $fixedName;
}
  

… и затем вызывается для каждого имени.

Что это делает:

Он изменяет все буквы на строчные, а затем первую букву на заглавную. Возвращает правильно отформатированное имя.

Дополнительный совет: используйте глаголы для имен функций вместо существительных. Это делает код намного более читаемым. Функция обычно что-то «делает» (глагол) вместо «является» чем-то (существительное).

 fixName($name)
  

…намного легче читать, чем

 nameFixer($name)
  

Комментарии:

1. @markus: Я прочитал много книг для начинающих, и большинство из них закрывают глаза на рекомендации по обучению основным концепциям. На самом деле это обычная практика, потому что лучшим методам намного сложнее научить новичков, потому что они рассматривают картинки большего размера, а новички еще не понимают эти картинки большего размера.

2. Я согласен лишь частично. Я думаю, что там слишком много плохих книг. Для авторов книг для начинающих нетрудно (и должно быть ОБЯЗАТЕЛЬНЫМ) придерживаться базовых рекомендаций. Книги для начинающих — это первое и решающее впечатление, и поэтому они должны служить хорошими моделями. Неудивительно, что мы видим так много плохо написанного кода, если авторы книг для начинающих сами такие плохие программисты.

3. Верно, но на самом деле это не является применимой «базовой» передовой практикой, когда вы говорите о том, как функции работают в целом. Похоже, он дошел до той части, где изучает, как функции работают в целом. Возможно, глава 2 будет «хорошо, теперь, когда вы понимаете, как они работают, давайте поговорим о том, как вы должны их использовать — лучшие практики». Вот тут-то и придут ваши мысли.

4. Этот ответ даже отдаленно не отвечает на вопрос, так почему же за него проголосовали?

5. Я изменил имя функции на name_fixer, в книге это было fix_names, а переменные были $ n1, $ n2, $ n3