powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Замыкание в объектах PHP
18 сообщений из 18, страница 1 из 1
Замыкание в объектах PHP
    #39706861
Stang
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Замыкание, это то, что я нашел близкое по смыслу, может я и ошибаюсь. Проблема такая, мне нужно вызывать метод внутри себя. Приведу пример кода, класс рабочий, но как только вызываю из себя, происходит бесконечный цикл. Может кто подскажет варианты куда идти?
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
	// Выводим вопрос
	public function laQuest ($id=1)
	{
		$stmt = $this->pdo->query("SELECT question FROM la_question WHERE id='".$id."'");
		$result = $stmt->fetch(PDO::FETCH_ASSOC);
		echo sprintf($result['question'], $this->user_name);
				
	}

	// Выводим ответы
	public function laAnswer ($id_question=1)
	{
		$sql = "SELECT id, id_next_question, answer FROM la_answer WHERE id_question='".$id_question."'";
		$result = array();

		$stmt = $this->pdo->prepare($sql);

		$stmt->execute();

		while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
			$result[$row['id']] = $row;
		}

		return $result;
	}


	// Делаем блок с вопросом и ответами
	public function laBlock ($id=1)
	{
		//вопрос
		echo "<div class=\"divQ\">";
		$this->laQuest();
		echo "</div>";

		//ответ
    	$answers = $this->laAnswer();

    	echo "<div class=\"divA\">";
    	if (!isset($_REQUEST['doGo'])) { ?>

    		<form action="<?=$_SERVER['SCRIPT_NAME']?>">

			<?php
    			foreach ($answers as $answer) {
					echo "<input type=\"submit\" name=\"doGo\" value=\"".$answer['answer']."\">"."&nbsp;&nbsp;&nbsp;&nbsp;";
					$id = $answer['id_next_question'];
				}
			?>

			</form>

			<?php } else {
			if ($_REQUEST['doGo'] != null) {
				$this->laBlock($id)->__invoke();

			}
			
		echo "</div>";
		}
	}


Если коротко, что делает - function laBlock: В блок выводится вопрос и варианты ответов, все берется из БД. Мне нужно, чтобы при нажатии кнопки (вариант ответа), function laBlock перерисовала себя с уже новыми данными... Как то так. Буду благодарен любой помощи, где читать, чего делать.
...
Рейтинг: 0 / 0
Замыкание в объектах PHP
    #39706878
Stang
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: php
1.
$this->laBlock($id)->__invoke();


__invoke() тут лишнее, это я экспериментировал.
...
Рейтинг: 0 / 0
Замыкание в объектах PHP
    #39706970
Luchok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем в функции саму себя вызывать? это ж рекурсия, она вроде тут не нужна. Выход из неё не прописан, вот и зацикливание происходит. На сколько понимаю здесь
Код: php
1.
$answers = $this->laAnswer();


в функцию не передается параметр, значит берется по умолчанию отсюда
Код: php
1.
public function laAnswer ($id_question=1)


, то есть единица

Если передать в эту функцию параметр со значением нажатой кнопки
Код: php
1.
value=\"".$answer['answer']."\">"


, то всё перерисуется

зы: или я чего-то не понял в логике?
...
Рейтинг: 0 / 0
Замыкание в объектах PHP
    #39706999
Stang
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LuchokЗачем в функции саму себя вызывать? это ж рекурсия, она вроде тут не нужна. Выход из неё не прописан, вот и зацикливание происходит. На сколько понимаю здесь
Код: php
1.
2.
3.
$answers = $this->laAnswer();[/quot]
А как я выведу первые ответы к первому вопросу?
[quot Luchok]


в функцию не передается параметр, значит берется по умолчанию отсюда
Код: php
1.
public function laAnswer ($id_question=1)


, то есть единица

Если передать в эту функцию параметр со значением нажатой кнопки
Код: php
1.
value=\"".$answer['answer']."\">"


, то всё перерисуется

зы: или я чего-то не понял в логике?
Единица и стоит, чтобы при запуске у меня первый вопрос и ответы к нему прорисовывались. Тут все работает. А вот когда я жмакаю на кнопку, у меня происходит зацикливание. Хотя я уже и пытаюсь передать id вытянутый из запроса
Код: php
1.
$id = $answer['id_next_question'];
...
Рейтинг: 0 / 0
Замыкание в объектах PHP
    #39707004
Stang
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блин, накрутил что-то с цитированием. Без
Код: php
1.
$answers = $this->laAnswer();


я не прорисую первые ответы.

Причем, в цикл уходит по первому вопросу, на следующий я не перехожу. Может ошибка в том, что я по умолчанию и ответам задаю id а его надо подставлять? Черт, мозги закипели, сейчас буду думать.
...
Рейтинг: 0 / 0
Замыкание в объектах PHP
    #39707103
Luchok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stang, по первой используется значение по умолчанию. это ясно. покажи код, где эта функция (laAnswer) вызывается с передаваемым от пользователя параметром? где-нибудь она еще вызывается иначе как ты принимаемые данные от пользователя будешь обрабатывать?
...
Рейтинг: 0 / 0
Замыкание в объектах PHP
    #39707107
Luchok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я бы написал где-то так
авторpublic function laBlock ($id=1)
{
//вопрос
echo "<div class=\"divQ\">";
$this->laQuest();
echo "</div>";



echo "<div class=\"divA\">";
if (!isset($_REQUEST['doGo'])) {
//ответ
$answers = $this->laAnswer($id);

} else {
$answers = $this->laAnswer();


} echo "</div>"; ?>

<form action="<?=$_SERVER['SCRIPT_NAME']?>">

<?php
foreach ($answers as $answer) {
echo "<input type=\"submit\" name=\"doGo\" value=\"".$answer['answer']."\">"."    ";
$id = $answer['id_next_question'];
}
?>

</form>

}
валидность в валидаторе посмотришь. в блокнотике написал, синтаксис не проверял
...
Рейтинг: 0 / 0
Замыкание в объектах PHP
    #39707110
Luchok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вместо тэга кода поставил цитату...

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
public function laBlock ($id=1)
{
//вопрос
echo "<div class=\"divQ\">";
$this->laQuest();
echo "</div>";



echo "<div class=\"divA\">";
if (!isset($_REQUEST['doGo'])) { 
//ответ
$answers = $this->laAnswer($id); 

} else {
$answers = $this->laAnswer();


} echo "</div>"; ?>

<form action="<?=$_SERVER['SCRIPT_NAME']?>">

<?php
foreach ($answers as $answer) {
echo "<input type=\"submit\" name=\"doGo\" value=\"".$answer['answer']."\">"."    ";
$id = $answer['id_next_question'];
}
?>

</form>

}
...
Рейтинг: 0 / 0
Замыкание в объектах PHP
    #39707168
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гм...

Берем, сохраняем сие (ну или подобное) в quest.php, который рисует вопрос XXX и варианты ответов. На кнопку POST вешаем action=quest.php (вызываем сами себя). В который отдаем только что выбранный вариант ответа YYY в $_POST[].

Никаких замыканий, никакой рекурсии.
...
Рейтинг: 0 / 0
Замыкание в объектах PHP
    #39707225
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторwhile($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$result[$row['id']] = $row;
}


$PDOstmt->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_GROUP)
...
Рейтинг: 0 / 0
Замыкание в объектах PHP
    #39707324
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Замыкание ага)
...
Рейтинг: 0 / 0
Замыкание в объектах PHP
    #39707379
Luchok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMasterГм...

Берем, сохраняем сие (ну или подобное) в quest.php, который рисует вопрос XXX и варианты ответов. На кнопку POST вешаем action=quest.php (вызываем сами себя). В который отдаем только что выбранный вариант ответа YYY в $_POST[].

Никаких замыканий, никакой рекурсии.
че на чела набросились. учится он. может лабораторку ему надо сделать
...
Рейтинг: 0 / 0
Замыкание в объектах PHP
    #39707892
Stang
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Luchokя бы написал где-то так
авторpublic function laBlock ($id=1)
{
//вопрос
echo "<div class=\"divQ\">";
$this->laQuest();
echo "</div>";



echo "<div class=\"divA\">";
if (!isset($_REQUEST['doGo'])) {
//ответ
$answers = $this->laAnswer($id);

} else {
$answers = $this->laAnswer();


} echo "</div>"; ?>

<form action="<?=$_SERVER['SCRIPT_NAME']?>">

<?php
foreach ($answers as $answer) {
echo "<input type=\"submit\" name=\"doGo\" value=\"".$answer['answer']."\">"."    ";
$id = $answer['id_next_question'];
}
?>

</form>

}
валидность в валидаторе посмотришь. в блокнотике написал, синтаксис не проверял
Ну не знаю, вроде правильно понял, объявил вроде и как глобальную переменную, и крутил по разному, результат тот же, при нажатии кнопки уходит в зацикливание:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
public function laBlock ($id=1)
	{
		$id = 1;
		//вопрос
		echo "<div class=\"divQ\">";
		$quests = $this->laQuest();
		//echo $quests['question'];
		$this->idQ = $quests['id']; //получаю id ответов, чтобы и по первому разу был вывод
		
		echo "</div>";

		//ответ
    	$answers = $this->laAnswer($this->idQ);

    	echo "<div class=\"divA\">";
    	if (!isset($_REQUEST['doGo'])) { ?>

    		<form method="POST"action="<?=$_SERVER['SCRIPT_NAME']?>">

			<?php
    			foreach ($answers as $answer) {
					echo "<input type=\"submit\" name=\"doGo\" value=\"".$answer['answer']."\">"."&nbsp;&nbsp;&nbsp;&nbsp;";
					$id = $answer['id_next_question'];
				}
			?>

			</form>

			<?php } else {
			if ($_REQUEST['doGo'] != null) {
				$this->laBlock($id);

			}
			
		echo "</div>";
		}
	}


Может подобное и с id вопроса провернуть? Тут наверное проще показать...
...
Рейтинг: 0 / 0
Замыкание в объектах PHP
    #39707893
Stang
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И по нажатию кнопки:
...
Рейтинг: 0 / 0
Замыкание в объектах PHP
    #39708664
Stang
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите где почитать про геттеры, сеттеры и анонимные функции? Что-то моих мозгов пока не хватает для php.net. Не знаю как анонимные функции, а вот геттеры и сеттеры мне точно тут нужны. И вроде понимаю для чего, а вот реализовать не могу.
...
Рейтинг: 0 / 0
Замыкание в объектах PHP
    #39709357
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stang,

На кой тебе они нужны в твоей задаче?

Файл QUEST.PHP

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
<?php

function ShowQuest($questnum)
{
   echo "Показываем вопрос $questnum";
}

$questnum=0; // default
$answer=0;     

if isset($_POST["qid"]) 
   {
      $questnum=$_POST["qid"];  // ответили на вопрос
   }
if isset($_POST["aswer"])
   {
       $answer=$_POST["answer"];
   }

ShowQuest($questnum);  // показали вопрос
?>
// подготовили и показали варианты ответа
<form  action="quest.php" method=POST>
      <SELECT style='width: 100%%' NAME='answer' ID='answer'>
             <OPTION VALUE="1" SELECTED>Ответ N1 </OPTION>
             <OPTION VALUE="2" SELECTED>Ответ N2 </OPTION>
             <OPTION VALUE="3" SELECTED>Ответ N3 </OPTION>
      </SELECT>
      <input type='submit' name='doasw' value='Ответить'>
     <?php
         print("<input type='hidden' id='qid' name='qid' value=$questnum>");
      ?>
</form>



Идея понятна? Писал здесь, не проверял...
...
Рейтинг: 0 / 0
Замыкание в объектах PHP
    #39709638
Korcar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StangПодскажите где почитать про геттеры, сеттеры и анонимные функции? Что-то моих мозгов пока не хватает для php.net. Не знаю как анонимные функции, а вот геттеры и сеттеры мне точно тут нужны. И вроде понимаю для чего, а вот реализовать не могу.
кхм ... Ты мой пример смотрел? ты ж ща запостил практически то же самое, что и в стартовом посте

Зайдем с другой стороны. Для начала покажи в какой строчке ты передаешь в функцию lablock значение ответа, получаемого от пользователя при нажатии кнопки, чтобы перестроить страницу вопрос-ответ с новыми данными
...
Рейтинг: 0 / 0
Замыкание в объектах PHP
    #39709644
Korcar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
извиняйте. топиком ошибся)
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Замыкание в объектах PHP
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]