Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Вложенные функции ПХП (https://javascript.ru/forum/server/27039-vlozhennye-funkcii-pkhp.html)

kilogram 31.03.2012 22:21

Вложенные функции ПХП
 
Читаю вложенные функции, там такой пример,странно, не работает
<html><body>
<?php
function father($a){
	echo $a, "<br>";
function child($b){
	echo $b+1,"<br>";
	return $b * $b;
}
return $a * $a * $child($a);
}

father(10);
child(30);
?>
</body></html>

kilogram 31.03.2012 22:39

Сорри, название функции с долларом написал

kilogram 31.03.2012 23:21

Откуда вывелось 11, если в child попадает вообще 30, должно 31 быть.

T-sh 01.04.2012 10:50

скрипт возвращает:

10
11
31.

Всё верно.

Передали father(10) (a = 10)

Выполняется:
1. echo $a, "<br>"; // выводит 10

2. инициализируется child()

3. Запрашивается child(a):
return $a * $a * child($a); // выводит 11

Передали child(30) (b = 30):

1. echo $b+1,"<br>"; // выводит 31

kilogram 01.04.2012 16:25

То есть передав аргумент 10 функции father, объявив нвутри этой функции father функцию child, тоже с одним параметром, я получается ему передаю то же значение 10, которое увеличивается на 1 после этой строки echo $b+1,"<br>"; и стает 11?
Ещё, попробовал убрать вот эту строку return $b * $b; и код со всем не изменился, а выдает те же значения что и с этой строкой, что и без неё? Почему?

Насчет этой строки:
return $a * $a * child($a);
здесь получается 10*10*30 что ли? Как считается?

T-sh 01.04.2012 16:40

Цитата:

Сообщение от kilogram (Сообщение 166284)
То есть передав аргумент 10 функции father, объявив нвутри этой функции father функцию child, тоже с одним параметром, я получается ему передаю то же значение 10, которое увеличивается на 1 после этой строки echo $b+1,"<br>"; и стает 11?
Ещё, попробовал убрать вот эту строку return $b * $b; и код со всем не изменился, а выдает те же значения что и с этой строкой, что и без неё? Почему?

Насчет этой строки:
return $a * $a * child($a);
здесь получается 10*10*30 что ли? Как считается?

вот теперь я понял, с чем у вас непонятки :))

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

а передастся ей значение 10 ($a) только тогда, когда её вызову с этим параметром, в вашем случае это строка №9.

и второй важный момент:
return и echo — это разные вещи.

То, что вы видите на странице после исполнения вашего кода — это не значение, которые возвращают функции, а лишь то, что указано в "echo".

Если написать так (убрать все echo):

<?php
function father($a){

function child($b){
    return $b * $b;
}
return $a * $a * $child($a);
}
 
$result = father(10);   // равно 10 000
echo $result;  // выведется на страницу 10 000

$result2 = child(30);  // равно 900
echo $result2; // выведется на страницу 900
?>


то в переменные $result и $result2 вернутся (то, что делает return) значения: 10 000 т.е. (10*10*(10*10)) и 900 (т.е. 30*30).

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

T-sh 01.04.2012 16:43

а строка

return $a * $a * child($a);

сделает следующее: 10*10* (тут произойдет вызов функции child(10) )

и на экран выведется 11 — так как произошел вызов функции и она исполнилась:

1. вывела на экран аргумент+1 (10+1)
2. перемножила аргументы и вернула (в память, но не на страницу) получившееся значение.

kilogram 01.04.2012 16:59

Спасибо за пояснение.
По поводу этой строки.
child($a) = child(10)
return  $a * $a * child($a);

10*10*10=1000, откуда 10 тысяч?

T-sh 01.04.2012 17:03

function child($b){
echo $b+1,"<br>";
return $b * $b;
}

child(10) выведет на экран 11, но в себе вернёт 10*10.

итого:

return $a * $a * child($a); = 10 *10 * (10*10). = 10 000

kilogram 03.04.2012 16:31

<?php
function father($a){
    echo $a, "<br>";
function child($b){
    echo $b+1,"<br>";
    return  $b * $b;
}

return  $a * $a * child($a);
}

$result = father(10);
echo $result;
echo '<br>';
?>


Если взять отдельно такой код, получается что
после этой строки
echo $b+1,"<br>";

выводится 11, но следующая за ней строка она не берет это число 11 и не подставляет в переменную $b, почему подставляется 10, а не 11 в строке ниже?
return  $b * $b;


Часовой пояс GMT +3, время: 08:53.