Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 31.03.2012, 22:21
Профессор
Отправить личное сообщение для kilogram Посмотреть профиль Найти все сообщения от kilogram
 
Регистрация: 19.03.2012
Сообщений: 163

Вложенные функции ПХП
Читаю вложенные функции, там такой пример,странно, не работает
<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>
Ответить с цитированием
  #2 (permalink)  
Старый 31.03.2012, 22:39
Профессор
Отправить личное сообщение для kilogram Посмотреть профиль Найти все сообщения от kilogram
 
Регистрация: 19.03.2012
Сообщений: 163

Сорри, название функции с долларом написал
Ответить с цитированием
  #3 (permalink)  
Старый 31.03.2012, 23:21
Профессор
Отправить личное сообщение для kilogram Посмотреть профиль Найти все сообщения от kilogram
 
Регистрация: 19.03.2012
Сообщений: 163

Откуда вывелось 11, если в child попадает вообще 30, должно 31 быть.
Ответить с цитированием
  #4 (permalink)  
Старый 01.04.2012, 10:50
Аватар для T-sh
Профессор
Отправить личное сообщение для T-sh Посмотреть профиль Найти все сообщения от T-sh
 
Регистрация: 04.12.2009
Сообщений: 579

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

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
__________________
С моих слов записано верно.
Ответить с цитированием
  #5 (permalink)  
Старый 01.04.2012, 16:25
Профессор
Отправить личное сообщение для kilogram Посмотреть профиль Найти все сообщения от kilogram
 
Регистрация: 19.03.2012
Сообщений: 163

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

Насчет этой строки:
return $a * $a * child($a);
здесь получается 10*10*30 что ли? Как считается?
Ответить с цитированием
  #6 (permalink)  
Старый 01.04.2012, 16:40
Аватар для T-sh
Профессор
Отправить личное сообщение для T-sh Посмотреть профиль Найти все сообщения от T-sh
 
Регистрация: 04.12.2009
Сообщений: 579

Сообщение от kilogram Посмотреть сообщение
То есть передав аргумент 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, вне зависимости, какие там дальше будет действия.
__________________
С моих слов записано верно.
Ответить с цитированием
  #7 (permalink)  
Старый 01.04.2012, 16:43
Аватар для T-sh
Профессор
Отправить личное сообщение для T-sh Посмотреть профиль Найти все сообщения от T-sh
 
Регистрация: 04.12.2009
Сообщений: 579

а строка

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

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

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

1. вывела на экран аргумент+1 (10+1)
2. перемножила аргументы и вернула (в память, но не на страницу) получившееся значение.
__________________
С моих слов записано верно.
Ответить с цитированием
  #8 (permalink)  
Старый 01.04.2012, 16:59
Профессор
Отправить личное сообщение для kilogram Посмотреть профиль Найти все сообщения от kilogram
 
Регистрация: 19.03.2012
Сообщений: 163

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

10*10*10=1000, откуда 10 тысяч?
Ответить с цитированием
  #9 (permalink)  
Старый 01.04.2012, 17:03
Аватар для T-sh
Профессор
Отправить личное сообщение для T-sh Посмотреть профиль Найти все сообщения от T-sh
 
Регистрация: 04.12.2009
Сообщений: 579

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
__________________
С моих слов записано верно.
Ответить с цитированием
  #10 (permalink)  
Старый 03.04.2012, 16:31
Профессор
Отправить личное сообщение для kilogram Посмотреть профиль Найти все сообщения от kilogram
 
Регистрация: 19.03.2012
Сообщений: 163

<?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;
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Установить имя конструктора Андрей Параничев Общие вопросы Javascript 8 17.11.2011 10:09
Как в браузерах реализуются функции DOM (например createElement) iamme Общие вопросы Javascript 7 02.09.2011 20:26
arguments вызвавшей функции mister_maxim Общие вопросы Javascript 4 12.10.2010 16:21
Подскажите, как работает простой код (замыкание функции)? Dotod Общие вопросы Javascript 5 02.12.2009 04:03
PHP ООП и вложенные функции Tim Серверные языки и технологии 6 15.06.2009 08:01