2015-02-27 2 views
1

Я не знаю, что происходит, но это очень расстраивает. Мой код:Переменные класса Codeigniter сбрасываются

class Catalog extends CI_Model { 

    private $tree_selected_item = 1; 

    public function get_tree_item_selected() { 
     return empty($this->tree_selected_item) ? 1 : $this-> 

    public function set_tree_item_selected($i){ 
     $this->tree_selected_item = $i; 
} 

Так что я могу использовать, что там, где я хочу делать:

$this->catalog->set_tree_item_selected($i); 
$selected = $this->catalog->get_tree_item_selected(); 

Проблема заключается в том, я могу изменить значение этой переменной. но когда я перехожу на другую страницу, эта переменная сбрасывается до первоначального значения: 1. Почему?

Кажется, что модель загружается каждый раз? поэтому переменная всегда определяет значение 1?

Я пробовал без присваивания значения, а затем, когда я получаю переменную, возвращает null.

Я не знаю, что попробовать

ответ

0

PHP является, по существу, без гражданства. Это означает, что для каждого запроса будет создан новый экземпляр всех используемых вами классов и инициализирован, как определено в бите кода class {}. Так как ваш класс объявляет и инициализирует свойство, как так:

private $tree_selected_item = 1; 

Вы говорите, вы уже пробовали не присвоения значения, в результате которой в поглотителе returing null. Это, опять же, следует ожидать: переменные PHP, которые не инициализируются, по умолчанию инициализируются до null. Точно так же, как переменные JavaScript инициализируются до undefined.

Во всяком случае, все это означает, что каждый экземпляр будет начать в жизни с tree_selected_item значением 1. Если вы хотите, чтобы отслеживать значения в промежутках между запросами, вы должны будете использовать $_POST, $_GET, $_COOKIE или предпочтительно $_SESSION для хранения этих данных. Тогда вы просто определить конструктор в классе, который принимает значения, которые вы хотите в качестве аргументов, то есть:

public function __constructor($treeItem = 1) 
{ 
    $this->tree_selected_item = (int) $treeItem; 
} 

Seeing, как вы добавили этот вопрос CodeIgniter, вы можете захотеть изменить свой стиль кодирования, чтобы соответствовать the codeigniter standards. Значение отступов в стиле allman (открытие { происходит по отдельной строке и все такое).

Поэтому, когда вам нужно значение tree_selected_item, чтобы упорствовать между запросами, вам нужно будет сделать что-то вроде этого (я не использовал CI, поэтому мне придется оставить его для вас, чтобы преобразовать этот код в CI-способ делать вещи):

//session_start(); should be called prior to this point 
$_SESSION['treeItem'] = $instance->get_tree_selected_item(); 

так что приезжайте следующий запрос, вы можете правильно инициализировать экземпляр:

//again, you need a session_start call 
$instance = new Catalog($_SESSION['treeItem']); 

конечно, вы обнаружите, что, по мере роста вашего приложения, огромное количество значений, которые вы хотите сохранить, становится довольно большим. Именно в этот момент вы начнете использовать сеансы как средство идентификации пользователей и используйте БД для хранения всех соответствующих данных. Вот почему PHP традиционно используется в тандеме с DB-сортировками (например, LA (N) MP-стек - Linux (серверная ОС) Apache (Web-сервер) (нет) MySQL и PHP, логика приложения)

+0

Я не знал, что ... так что единственный способ «сохранить» переменные - через предопределенные переменные PHP? Мех ..:( – slayerbleast

+0

@slayerbleast: Нет, существует много способов «сохранить» значения: хранилище DB, файлы, вторичную среду без состояния, сеансы, файлы cookie, ... Но то, что вы не можете сделать, - это состояние объекта, который сохраняется между запросами. PHP, как и большинство языков, ориентированных на Интернет, не имеет аналогов, и это хорошо. Конечно, он порождает некоторые [псевдопоэтические записи в стиле хиппи] (http: // ruudhein. com/mind-like-water-phps-stateeless-state), но не обманывайте себя, безгражданство - это хорошо. Подумайте о запросе, загрузите свой компьютер, выполните некоторую работу и снова закройте (отправьте ответ) –

+0

@slayerbleast: рискуя увидеть рев-голодных.Если я правильно ответил на ваш вопрос, не могли бы вы серьезно (отметив это как принято) (http://meta.stackexchange.com/q/5234) не уверен в чем-то, тем не менее, не стесняйтесь запрашивать дополнительную информацию (или опубликовать дополнительную информацию) –

Смежные вопросы