Гость
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Замыкание в объектах PHP / 18 сообщений из 18, страница 1 из 1
24.09.2018, 11:33
    #39706861
Stang
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замыкание в объектах 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.
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
24.09.2018, 11:50
    #39706878
Stang
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замыкание в объектах PHP
Код: php
1.
$this->laBlock($id)->__invoke();


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


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


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

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


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

зы: или я чего-то не понял в логике?
...
Рейтинг: 0 / 0
24.09.2018, 13:59
    #39706999
Stang
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замыкание в объектах PHP
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
24.09.2018, 14:03
    #39707004
Stang
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замыкание в объектах PHP
Блин, накрутил что-то с цитированием. Без
Код: php
1.
$answers = $this->laAnswer();


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

Причем, в цикл уходит по первому вопросу, на следующий я не перехожу. Может ошибка в том, что я по умолчанию и ответам задаю id а его надо подставлять? Черт, мозги закипели, сейчас буду думать.
...
Рейтинг: 0 / 0
24.09.2018, 15:06
    #39707103
Luchok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замыкание в объектах PHP
Stang, по первой используется значение по умолчанию. это ясно. покажи код, где эта функция (laAnswer) вызывается с передаваемым от пользователя параметром? где-нибудь она еще вызывается иначе как ты принимаемые данные от пользователя будешь обрабатывать?
...
Рейтинг: 0 / 0
24.09.2018, 15:13
    #39707107
Luchok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замыкание в объектах PHP
я бы написал где-то так
автор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
24.09.2018, 15:16
    #39707110
Luchok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замыкание в объектах 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.
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
24.09.2018, 16:09
    #39707168
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замыкание в объектах PHP
Гм...

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

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


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

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

Никаких замыканий, никакой рекурсии.
че на чела набросились. учится он. может лабораторку ему надо сделать
...
Рейтинг: 0 / 0
25.09.2018, 17:14
    #39707892
Stang
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замыкание в объектах PHP
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
25.09.2018, 17:15
    #39707893
Stang
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замыкание в объектах PHP
И по нажатию кнопки:
...
Рейтинг: 0 / 0
26.09.2018, 17:10
    #39708664
Stang
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замыкание в объектах PHP
Подскажите где почитать про геттеры, сеттеры и анонимные функции? Что-то моих мозгов пока не хватает для php.net. Не знаю как анонимные функции, а вот геттеры и сеттеры мне точно тут нужны. И вроде понимаю для чего, а вот реализовать не могу.
...
Рейтинг: 0 / 0
27.09.2018, 15:27
    #39709357
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замыкание в объектах PHP
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
28.09.2018, 08:39
    #39709638
Korcar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замыкание в объектах PHP
StangПодскажите где почитать про геттеры, сеттеры и анонимные функции? Что-то моих мозгов пока не хватает для php.net. Не знаю как анонимные функции, а вот геттеры и сеттеры мне точно тут нужны. И вроде понимаю для чего, а вот реализовать не могу.
кхм ... Ты мой пример смотрел? ты ж ща запостил практически то же самое, что и в стартовом посте

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


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