Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Вопрос по классам в PHP  (Прочитано 22302 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« : 28-01-2004 23:52 » 

При использовании классов я делаю так

class site extends db
{

function site()
{
 global $prefix, $id, $onelistcount, $sort, $startpoint;
 
 $this->art_id = @$id; // For articles
 $this->art_topic_id = @$id; // For all articles

// Т.е. в данном случае id при первом вызове есть id статьи для ее отображения, а во втором случае - эта же глобальная переменная - это уже id категории для списка статей из нее.

function view_arts()
{
 // Эта выводит статью на обозрение всем.
$id = $this->$art_id;
}

function view_article()
{
// Эта выводит список статей из категории.
$id = $art_topic_id;


}
};

Иначе говоря - ежели указан параметр выводить статью, то запустится функция view_article() которая покажет статью по ID
Соответственно вызовется функция view_arts() которая покажет список статей.

Первая функция вызывается из файла viewart.php
Вторая из view.php которые подключают файл class.php в котором содержатся все описания вышеупомянутых классов.

А теперь представьте себе , что вызывая view.php?id=2 я получаю отображение правильного списка статей из категории id которой действительно 2 и одновременно вызов функции view_article().

Это видно по причине того, что колличество просмотров статьи id которой то же равен 2 растет  Я шокирован!

Т.е. при вызове класса в хидере на инициализацию, я получаю грубо говоря по башке.

Структура всех файлов такова:

hider

site new site;
Вывод инфы с вызовом функций класса сайт

Вот так.


Поясните мне ЧТО Я НЕПРАВИЛЬНО ДЕЛАЮ....

Что то тут не то.
Создается впечатление, что код каждой функции все равно выполняется, просто так как результатом функции являются возвращаемые значения, то я получаю по шапке в случае реального обновления данных таблицы в БД, а остальное теряется....
Записан

А птичку нашу прошу не обижать!!!
Fireworm
Гость
« Ответ #1 : 29-01-2004 07:57 » 

В
function view_article()
{
// Эта выводит список статей из категории.
$id = $art_topic_id;
}
ты забыл $this->

И эти функции возвращают занчение $id, или ты передаеш ее как глобальную? - Тогда необходимо объявить ее как globals

P.S. И лучше не использовать в классах глобальных переменных - теряется универсальность.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #2 : 29-01-2004 08:15 » 

Fireworm, это я здесь забыл $this.
Нет ты тут не понял. $id призодит от строки запроса в браузере и тут без глобальных переменных ен обойтись - юзер выбирает каталог или статью и его запрос организует id номер в строке запроса, который я хватаю и который отдаю классу, а вот потом начинается бред.
Записан

А птичку нашу прошу не обижать!!!
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #3 : 29-01-2004 09:08 » 

Вот полный текст класса при проверке.

Код:
<?

class site
{
var $count=10;
var $notags__tags_re="";
var $prefix;
var $art_id;
var $art_topic_id;
var $art_onelistcount;
var $art_sort;
var $art_startpoint;

function site()
{
 global $prefix, $id, $onelistcount, $sort, $startpoint;
 
 $this->art_id = @$id; // For articles
 $this->art_topic_id = @$id;
 $this->art_onelistcount = $onelistcount;
 $this->art_sort = @$sort;
 $this->art_startpoint = @$startpoint;
 
 $this->prefix = $prefix;
 
 
 $this->func_arr = array(
$this->show_main_topics_menu_line(),
$this->show_main_topics_menu_cat(),
$this->show_last_articles(),
$this->show_article(),
$this->show_articles()
);
 $this->tpl_arr = array(
"[!MAIN_TOPICS_MENU_LINE!]",
"[!MAIN_TOPICS_MENU_CAT!]",
"[!LAST_ARTICLES!]",
"[!SHOW_ARTICLE!]",
"[!SHOW_ARTICLES!]"
 );
 
}




function deinit()
{



}


function load_template($file_name)
{
    $file_tpl=fopen($file_name,'r');
    $text=fread($file_tpl,filesize($file_name));
    fclose($file_tpl);
    return $text;

}


function replace_template($tpl)
{
  $repl=preg_replace($this->tpl_arr,$this->func_arr,$tpl);
 
  return $repl;
}
 

 
function show_main_topics_menu_cat()
{


}


function show_main_topics_menu_line()
{

}

function show_last_articles()
{
}





function show_article()
{
$this->art_id = 10;
$this->art_topic_id = 20;
}

function show_articles()
{


}

}; // End of class

$site= new site;
?>


А вот код index.php

Код:
<?

include ("class.php");


$site->show_articles();

echo $site->art_id;
echo $site->art_topic_id;

?>



По логике вещей с такой вот строкой вызова

http://127.0.0.1/class/index.php?id=1

браузер должен отобразить 11 т.е. обыкновенный вызов функции без тела и неизмененные константы.

А результатом является 1020 в реальности, т.е. выполняется присвоение в функции которую не вызываю.
« Последнее редактирование: 23-11-2007 20:39 от Алексей1153++ » Записан

А птичку нашу прошу не обижать!!!
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 29-01-2004 10:34 » 

Вот работа приведенного кода после маленькой модификации (только вывод переменной $this->art_id в начале и конце ф-ии).
Код:
DEBUG: site(): in:
DEBUG: show_article(): in: 1
DEBUG: show_article(): out: 10
DEBUG: site(): out: 10
10
20
И что здесь не так работает? Что написал, то и происходит.
« Последнее редактирование: 23-11-2007 20:40 от Алексей1153++ » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #5 : 29-01-2004 11:11 » 

RXL, Я НЕ ВЫЗЫВАЮ show_article()
Я ВЫЗЫВАЮ show_articles();
Это разные функции.

show_article() в index.php вообще не должна вызываться - в том то и дело!!!!


<?

include ("class.php");


$site->show_articles();

echo $site->art_id;
echo $site->art_topic_id;

?>

И где тут show_article();  :?:
Записан

А птичку нашу прошу не обижать!!!
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 29-01-2004 11:18 » 

Вот именно что вызываешь  :!:
Фрагмент из site():
Код:
 $this->func_arr = array(
   $this->show_main_topics_menu_line(),
   $this->show_main_topics_menu_cat(),
   $this->show_last_articles(),
   $this->show_article(),
   $this->show_articles()
);
Ты заносишь в массив результаты вызова ф-ий.

Кстати, в предыдущем моем посте это видно - show_article() вызывалась внутри site().
« Последнее редактирование: 23-11-2007 20:41 от Алексей1153++ » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #7 : 29-01-2004 12:39 » 

Тогда так, я делаю темплейты.

Идея состояла в том, что бы в текст темплейта включать стандратные коснтанты (см. второй массив) а в самом php файле заменять его вызовом соответствующей ему функции.

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

Как это сделать.
Записан

А птичку нашу прошу не обижать!!!
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 29-01-2004 13:04 » 

Т.е., ты хочешь сделать массив указателей ($this->func_arr) на ф-ии?
Заноси в массив только имена ф-ий:
Код:
$this->func_arr=array("show_main_topics_menu_line",
   "show_main_topics_menu_cat",
   "show_last_articles",
   "show_article",
   "show_articles");

/* использовать: */
$this->func_arr[4]();
А вот как это работает за пределами ф-ий класса - не знаю.
« Последнее редактирование: 23-11-2007 20:42 от Алексей1153++ » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #9 : 29-01-2004 16:37 » 

RXL, попробую - агромадное спасибо....

А то я совсем запутался так как в жизни на php не работал.

Теперь будет и движок бытро.
Записан

А птичку нашу прошу не обижать!!!
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 29-01-2004 20:39 » 

Цитата
А то я совсем запутался так как в жизни на php не работал.
Я тоже Ага Главное не суетиться - от этого много ошибок
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #11 : 29-01-2004 21:48 » 

RXL, мда - я кстати посмотрел - не поможет.
Идея такова - считать любой темплейт и с помощью preg_replace сделать замену из массива 1 на массив два, т.е. заменить значения для темпелйтов из второго массива на резкльтат работу функции из другого.
Думаю, что замена на указатели мне ничего не даст, таким образом придется ставить в ручную местонахождение и с помощью switch оператора переделывать - но это некрасиво ИМХО.
Записан

А птичку нашу прошу не обижать!!!
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #12 : 29-01-2004 23:11 » 

Насчет ссылок - глянул в доку - оператор & - так же как и в С, но разименовывать уже не надо.

Замену хочешь делать на статические (однократно вычесленные) значения, или на динамические?

Для статической замены можно попробовать комбинацию preg_replace_callback() и strtr().
Для динамической можно тот же preg_replace_callback() и индексацию массива с ссылками на ф-ии посредством строк (tpl_arr).
Код:
$this->func_arr=array(
  "[!MAIN_TOPICS_MENU_LINE!]" => &$this->show_main_topics_menu_line,
.....
  );
// Использование вместе с preg_replace_callback() :
$match=$site->func_arr[$match]();
« Последнее редактирование: 23-11-2007 20:43 от Алексей1153++ » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Fireworm
Гость
« Ответ #13 : 30-01-2004 10:20 » 

Гром, А зачем изобретать велосипед? Ведь есть куча классов, которые отлично работают, например smarty или phplib.
А еще лучше положить все на xml/xslt
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #14 : 30-01-2004 10:40 » 

Цитата

А еще лучше положить все на xml/xslt

КАК - поподробнее.
Записан

А птичку нашу прошу не обижать!!!
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #15 : 30-01-2004 10:42 » 

RXL,  поподробнее.
Записан

А птичку нашу прошу не обижать!!!
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #16 : 30-01-2004 13:36 » 

Код:
<?

class site
{
var $count=10;
var $notags__tags_re="";
var $prefix;
var $art_id;
var $art_topic_id;
var $art_onelistcount;
var $art_sort;
var $art_startpoint;

function site()
{
 global $prefix, $id, $onelistcount, $sort, $startpoint;

 $this->art_id = @$id; // For articles
 $this->art_topic_id = @$id;
 $this->art_onelistcount = $onelistcount;
 $this->art_sort = @$sort;
 $this->art_startpoint = @$startpoint;

 $this->prefix = $prefix;

 $b = array( // временный массив - неудобно писать длинные имена с $this
    "[!MAIN_TOPICS_MENU_LINE!]" => 'show_main_topics_menu_line',
    "[!MAIN_TOPICS_MENU_CAT!]" => 'show_main_topics_menu_cat',
    "[!LAST_ARTICLES!]" => 'show_last_articles',
    "[!SHOW_ARTICLE!]" => 'show_article',
    "[!SHOW_ARTICLES!]" => 'show_articles'
    );

// формирование регулярного выражения
 $a=array_keys($b);
 $re='('.preg_quote(reset($a));
 for($v=next($a);$v;$v=next($a)) $re.='|'.preg_quote($v);
 $re.=')';

 $this->regexp=&$re; // использование жестких ссылок - метод оптимизации - можно и без них
 $this->func_arr = &$b;
}

//********* для каждой замены вызывается соотв. шаблону ф-ия
function replace_template2($match) {
    return call_user_func(array(&$this,$this->func_arr[$match[0]]));
    }

function replace_template($text) {
    return preg_replace_callback($this->regexp,array(&$this,'replace_template2'),$text);
    }
//*********

function deinit() {
    }

function load_template($file_name) {
    $file_tpl=fopen($file_name,'r');
    $text=fread($file_tpl,filesize($file_name));
    fclose($file_tpl);
    return $text;
    }

function show_main_topics_menu_cat() {
    }

function show_main_topics_menu_line() {
    }

function show_last_articles() {
    }

function show_article() {
    $this->art_id = 10;
    $this->art_topic_id = 20;
    return "----show_article----"; // для отладки
    }

function show_articles() {
    return "----show_articles----"; // для отладки
    }

}; // End of class

$site= new site;
?>
« Последнее редактирование: 23-11-2007 20:46 от Алексей1153++ » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #17 : 30-01-2004 21:15 » 

Интересно - но мне очень хочется в этом разобраться мог бы ты вставить коммнтарии с объяснением, так как куча дел и просто сидеть и копать это все времени нет, надо побыстрее закончить а вот просто копировать не буду - надо нормально понимать что сам делаешь...
Записан

А птичку нашу прошу не обижать!!!
Fireworm
Гость
« Ответ #18 : 31-01-2004 07:27 » 

Гром, Основная задача скрипта - сгенерировать xml. А далее простым движением:
Код:
$xh = xslt_create(); 
    $arguments = array(
    '/_xml' => $xml,
    '/_xsl' => $xslData
 );
$result = xslt_process($xh, 'arg:/_xml', 'arg:/_xsl', NULL, $arguments);
Накладываеш xslt на сгенерированный xml шаблон xslt - получаеш html и отдаеш пользователю.
Или тебя интересует как работает xslt вообще?
« Последнее редактирование: 23-11-2007 20:47 от Алексей1153++ » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #19 : 31-01-2004 14:24 » 

В массив заносим _имена_ ф-ий, а в качестве индексов используем шаблоны.
Код:
 $b = array(
    "[!MAIN_TOPICS_MENU_LINE!]" => 'show_main_topics_menu_line',
......
    );

На основе списка ключей массива $b генерим регулярное выражение. Это чтобы не делать лишнего массива с шаблонами. Результат - строка вида "(шаблон1|шаблон2|шаблон3)". Все спецсимволы предваряются '\'.
Код:
 $a=array_keys($b);
 $re='('.preg_quote(reset($a));
 for($v=next($a);$v;$v=next($a)) $re.='|'.preg_quote($v);
 $re.=')';

Модифицировал твою ф-ию replace_template(). В нее передается строка (можно сразу весь файл). При нахождении одного из шаблонов (согласно $this->regexp) вызывается callback ф-ия replace_template2(), а возвращаемое ею значение (строка) используется для замены текущего шаблона. В replace_template2() из массива $this->func_arr извлекается имя ф-ии и вызывается хитрым методом.
Код:
function replace_template2($match) {
    return call_user_func(array(&$this,$this->func_arr[$match[0]]));
    }

function replace_template($text) {
    return preg_replace_callback($this->regexp,array(&$this,'replace_template2'),$text);
    }

-------------------
В php, оказалось, понятия ссылки на ф-ию нет, но есть извращенные методы:
Код:
function aaa() { echo "aaa"; }

$a="aaa";
$a(); // косвенный вызов через переменную.
call_user_func($a); // через спец. ф-ию

class myclass {
  function xxx() { echo "xxx"; }
  }

call_user_func(array('myclass','xxx')); // вызов метода "статического" класса

$obj=new myclass;
call_user_func(array(&$obj,'xxx')); // вызов метода объекта через ссылку на объект
Вот последний метод я и использовал в replace_template() и replace_template2().

Вот ссылки на доки по теме:
http://www.php.net/manual/ru/function.preg-replace-callback.php
http://ru.php.net/manual/ru/function.call-user-func.php
Про callback ф-ии:
http://www.php.net/manual/ru/language.pseudo-types.php#language.types.mixed
« Последнее редактирование: 23-11-2007 20:51 от Алексей1153++ » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #20 : 01-02-2004 15:13 » 

Fireworm,
Цитата

Или тебя интересует как работает xslt вообще?

Да именно - как с парсированием XML кода я сталкивался, а вот как работа в вебе нет.
Отсюда - просьба.
Или тему заведи и напиши немного про это, если есть время или статейку - для меня и для сайта, по стартовым азам XML технологии в вебе.
Записан

А птичку нашу прошу не обижать!!!
Fireworm
Гость
« Ответ #21 : 02-02-2004 07:16 » 

Гром, Попробую... хотя таковых и хвтает в интернете...
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #22 : 02-02-2004 10:11 » new

Fireworm, Ок - жду.
Записан

А птичку нашу прошу не обижать!!!
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines