@pixelbroksart

Поможете понять суть аргументов в функциях php?

Мой вопрос может быть немного смазан , но я постараюсь внятно описать
Я частично не могу понять как это работает. Если брать базовый знания , то аргументом может быть какая нибудь не локальная переменная , а передаваемая в функцию с помощью того же аргумента.
Пример:
$name = John;
function uzver($name) {
   echo "Привет $name";
}

Но , я не могу понять как работают аргументы создаваемые вместе с функциями и более того если этих аргументов n-ое количество. Как они связываются , как их выделять в самой функции.
Пример:
function uzver($name, $pass, $mail, $phone) {
   echo "Привет $name";
}

А про то что аргументы могут быть еще функциями вообще молчу.
Более краткий вариант
Помогите пожалуйсто разобраться с аргументами. Если есть какое нибудь пособие как "для чайников" с примерами.

П.С. Знаю , пишу смешные вещи. Но почему то мне было легче понять обьекты чем функции . Спасибо большое заранее.
  • Вопрос задан
  • 2704 просмотра
Пригласить эксперта
Ответы на вопрос 4
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Область действия переменных учите вначале.
$name = John;
function uzver($name) {
   echo "Привет $name";
}

Тут [$name] и [($name) в функции] - две РАЗНЫХ переменных.
По-умолчанию в PHP переменные создаются "на-лету" при присваивании значений (или упоминании) и действуют в своей области.
Ответ написан
Комментировать
butteff
@butteff
Раз в тысячу лет заправляю свитер в носки
я записывал видеоурок по функциям, может будет полезным.
Ответ написан
Комментировать
Immortal_pony
@Immortal_pony Куратор тега PHP
При создании функции указывается, какие аргументы она будет принимать. Именно эти аргументы можно использовать в теле функции.
Когда вы функцию вызываете, то передаете ей какие-то значения в качетве аргументов.

Разберем ваш пример (чтобы избежать путаницы я немного его изменю).

/* Объявляем функцию uzver, которая будет принимать в качестве аргумента одну переменную */
function uzver($name) {
   echo "Привет, {$name}";
}




/* Объявляем перемнную $user_name и присваиваем ей значение 'John' */
$user_name = 'John';

/* Вызываем функцию, передав ей в качестве аргумента значение переменной $user_name */
uzver($user_name);

/* Вызываем функцию езе раз, передав ей в качестве аргумента другое значение */
uzver('Вася');
Ответ написан
Комментировать
KorsaR-ZN
@KorsaR-ZN
Начнем с понятия области видимости функции, функция видит только переменные созданные внутри ее тела, либо переданные через ее параметры (аргументы). Других для нее просто не существует.

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

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

Теперь более подробнее про переменные внутри функции и ее параметры.

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

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

Пример 1 (передача по значению)
$name = 'Вася';
function u($name)
{
   echo $name;
   $name = 'Коля';
}

echo u($name); // результат Вася
echo $name; // результат Вася


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

Пример 2 (передача по ссылке)
$name = 'Вася';
function u(&$name)
{
   echo $name;
   $name = 'Коля';
}

echo u($name); // результат Вася
echo $name; // результат Коля


Во втором примере получились такие результаты, т.к идет передача по ссылки и локальная переменная теперь указывает на внешнюю переменную и все изменения локальной на самом деле изменять внешнюю, т.к локальная в данном случаи является лишь ссылкой.

P.S Объекты (экземпляры класса) всегда передаются по ссылки не зависимо от значка &.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы