Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как правильно работать со статическими переменными 
V
    Опции темы
ArtiSoft
  Дата 19.1.2011, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 10.12.2009

Репутация: нет
Всего: нет



пишу сайт простой магазин, пишу класс шаблонизатора.  каждый раз когда запрашивается люьая страница из моего сайта, создается новый класс, который собирает шаблон и  ответы на запросов.    в одном дочернем классе нужня статическая переменная в одном методе
Код

  function position($pos){
    static $nom = 1;
    $nom_length = $this->getLength();
    switch($pos){
      case 1: { $nom = 1; break; }
      case 2: { if($nom > 1) $nom--; else $nom = 1; break; }
      case 6: { if($nom < $nom_length) $nom++; else $nom = $nom_length; break; }
      case 7: { $nom = $nom_length; break; }
    }
    $sqlres = mysql_query("SELECT * FROM alboms WHERE code='".$nom."'") or die('Query failed: ' . mysql_error());
    $this->setData($sqlres);
  }


ну вот стат перем не хранит постоянное значение((( пожскажте реализацию!))

Это сообщение отредактировал(а) ArtiSoft - 19.1.2011, 20:05
PM MAIL   Вверх
ksnk
Дата 19.1.2011, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Ну, для начала можно почитать про магическое слово static. Возможно по примерам станет понятнее как оно работает.

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

function position($pos){
    static $nom ;
    if(!isset ($nom)) $nom=1;
...






--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
ArtiSoft
Дата 19.1.2011, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 10.12.2009

Репутация: нет
Всего: нет



спасибо но не работает(( значит он сбрасывает значение, незнаю почему! говорится значит что он не был установлен значением) а как можно погругому?, со сессиями тоже странно, тоже сбрасывает значения(((
PM MAIL   Вверх
skyboy
Дата 20.1.2011, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



не у разных ли ты объектов вызываешь метод position?
обычно мне статические переменные попадались в функциях, когда используешь классы, есть механизм статических членов. и нет, не смотря на созвучие, это совсем разные вещи.
PM MAIL   Вверх
ArtiSoft
Дата 20.1.2011, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 10.12.2009

Репутация: нет
Всего: нет



Спасибо что помогаете!)
этот метод в классе data
первый класс, который собирает шаблон называется Admin
при каждом загрузки страницы вызывается Admin, а потом в одном его методе 
Код

function view(){}
  создается класс Data и вызываю метод position
PM MAIL   Вверх
ArtiSoft
Дата 20.1.2011, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 10.12.2009

Репутация: нет
Всего: нет



вообщем выглядит вот так
Код

class Data {
  public static $nom = 1;
  
  function position($pos){
    $nom_length = $this->getLength();
    switch($pos){
      case 1: { self::$nom = 1; break; }
      case 2: { if(self::$nom > 1) self::$nom--; else self::$nom = 1; break; }
      case 6: { if(self::$nom < $nom_length) self::$nom++; else self::$nom = $nom_length; break; }
      case 7: { self::$nom = $nom_length; break; }
    }
  }
}

class Admin {
  public function view($pos){
    $data = new Data;
    switch($pos){
      case 3: {$this->replace('form_add','content'); break;}
      case 8: {$data->add(); break;}
      case 4: {$this->replace('form_update','content'); break;}
      case 9: {$data->update(); break;}
      case 5: {$data->delet(); break;}
      case 1: case 2: case 6: case 7: {$data->position($pos); $this->_doc = str_replace('<!--[%content%]-->', $data->getData(), $this->_doc); break;}
    }
  }
}

$admin = new Admin;
 if (isset($_GET['pro'])){
    $admin->view($_GET['pro']);
  }


структура вот такая. почему то при каждом создании объекта сбрасывает значение(((
PM MAIL   Вверх
patap
Дата 20.1.2011, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 893
Регистрация: 7.5.2005
Где: Украина, Зп

Репутация: 26
Всего: 40



поробуй на простом примере, допустим при каждом вызове position() инкрементировать $nom и выводить значение (без всяких проверок), чтобы убедится что static работает. потому, что можно предположить, что могут быть неточности в логике со switch'ами


--------------------
На боку кобура болталась, сзади шашка отцовская звякала. 
Впереди меня все хохотало, а позади все плакало (с)
PM MAIL ICQ   Вверх
ArtiSoft
Дата 20.1.2011, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 10.12.2009

Репутация: нет
Всего: нет



попробую спасибо!
PM MAIL   Вверх
SneG0K
Дата 20.1.2011, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


Профиль
Группа: Завсегдатай
Сообщений: 1887
Регистрация: 1.12.2007
Где: Wis Dells

Репутация: 7
Всего: 54



Что-то мне кажется, что вы пытаетесь сохранять значение между запросами.
Может вам $_SESSION?
 Заранее прошу прощения, если ошибаюсь.
PM WWW Skype   Вверх
ArtiSoft
Дата 21.1.2011, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 10.12.2009

Репутация: нет
Всего: нет



Цитата(SneG0K @ 20.1.2011,  20:04)
Что-то мне кажется, что вы пытаетесь сохранять значение между запросами.
Может вам $_SESSION?
 Заранее прошу прощения, если ошибаюсь.


сессия почему то тоже не помогает
PM MAIL   Вверх
skyboy
Дата 22.1.2011, 01:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата(ArtiSoft @  21.1.2011,  19:25 Найти цитируемый пост)
сессия почему то тоже не помогает 

в смысле - "не помогает"? а РНР - помогает?
либо тебе надо хранить данные для одного клиента между разными вызовами - тогда сессии или кукисы. либо тебе надо хранить данные для всех сессиий всех клиентов одновременно - тогда запись в файл/базу данных, общая память или внешние хранилища по типу memcache. либо тебе надо хранить данные между разными вызовами одного и того же метода в пределах одной сессии - тогда статическая переменная или статическое поле класса. 
нечего перебирать по порядку. определиться с потребностями и выяснять, что же мешает "с наскоку" заюзать подходящий механизм.
PM MAIL   Вверх
ArtiSoft
Дата 22.1.2011, 02:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 10.12.2009

Репутация: нет
Всего: нет



надо хранить данные между разными вызовами одного и того же метода - тогда статическая переменная или статическое поле класса. 
вот это больше помогло спасибо
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0878 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.