Простой вопросик по PHP

sniper1

Новичок
сбрасываются экземпляры классов

В общем недавно начал работать с классами PHP, возникла проблема. Суть: у меня есть index.php, в который включаются (методом require_once) файлы с описанием нескольких классов (в этих же файлах заводится по одному экземляру на класс). Проблема в том, что при любом редиректе или вызове любой страницы у меня все изменения в классах сбрасываются. Такое ощущение, что файлы с описанием классов и объявлениями экземпляров включается каждый раз при построении страницы, в связи с чем каждый новый экземпляр класса имеет все свойства по умолчанию. Как от этого избавиться? В общем-то нужно просто хранить конкретные глобальные экземпляры классов, и все

-~{}~ 17.07.08 05:18:

одно небольшое дополнение - ничего абсолютно (никакие переменные) не сохраняются в течение жизни скрипта. То есть я вызываю каждый раз свой скрипт в течение одной сессии, и ничего не сохраняется даже в $_SESSION
 

rotoZOOM

ACM maniac
Такое ощущение, что файлы с описанием классов и объявлениями экземпляров включается каждый раз при построении страницы, в связи с чем каждый новый экземпляр класса имеет все свойства по умолчанию.
Как ни странно, но твои ощущения тебя не подводят.
Как от этого избавиться?
Сохранять состояние объектов (сами объекты), а при последующих
редиректах или перезагрузках восстанавливать его, например сессии, либо БД.
 

sniper1

Новичок
Но, позвольте, зачем тогда нужны все эти классы и глобальные переменные? Они, если так рассуждать, ни разу не глобальные!
 

sniper1

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

zerkms

TDD infected
Команда форума
sniper1
http://phpfaq.ru/na_tanke

может тогда так?

не путай прикладные приложения и веб-приложения, написанные на пхп. последние - "живут" только в течение запроса. и запросы между собой НИКАК НЕ СВЯЗАНЫ, такая уж особенность HTTP. поэтому ты, как программист на этом чудесном ЯП, сам должен позаботиться о сохранении состояний данных между вызовами. фирштейн?
 

sniper1

Новичок
короче, получается так:

inc1.php
<?php

$a = 1;

?>

index.php
<?php

include_once "inc1.php";
echo $a;

function foo()
{
global $a;
echo $a;
}

foo ();
$a = 2;
header("Location: index.php")


?>

генерирует вывод:
1
1
1
1

то есть после редиректа на себя все теряется
 

zerkms

TDD infected
Команда форума
да что ты прицепился к редиректу...
после того, как код дошёл до последней строки, всё, больше не существует переменных и прочего. следующий вызов (не важно чем инициированный - редиректом или запросом пользователя) всё запустит заново "с нуля"
 

sniper1

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

-~{}~ 17.07.08 14:37:

все классно, только вот другая штука получилась:

inc.php
<?php

class A
{
var $a = 0;
}

if (!isset($_SESSION['classA']))
$_SESSION['classA'] = new A;

?>

index.php
<?php

include_once "inc.php";

function foo()
{
$classA = &$_SESSION['classA'];
$classA->a = 3;
}

foo ();

header("Location: index.php")

?>

ругается, что $classA __PHP_Incomplete_Class Object. С обычными переменными такая штука проходит и все работает
 

zerkms

TDD infected
Команда форума
потому что все классы должны быть определены до session_start(), иначе интерпретатор не знает как проводить десериализацию
 
Сверху