Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
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. И лучше не использовать в классах глобальных переменных - теряется универсальность.
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #2 : 29-01-2004 08:15 » |
|
Fireworm, это я здесь забыл $this. Нет ты тут не понял. $id призодит от строки запроса в браузере и тут без глобальных переменных ен обойтись - юзер выбирает каталог или статью и его запрос организует id номер в строке запроса, который я хватаю и который отдаю классу, а вот потом начинается бред.
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
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
|
|
« Ответ #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++ »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
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
|
|
« Ответ #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++ »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #7 : 29-01-2004 12:39 » |
|
Тогда так, я делаю темплейты.
Идея состояла в том, что бы в текст темплейта включать стандратные коснтанты (см. второй массив) а в самом php файле заменять его вызовом соответствующей ему функции.
В чем я неправ, теперь то я понял где собака порылась, я уже создаю результаты, а мне надо именно вызов заносить.
Как это сделать.
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
RXL
|
|
« Ответ #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++ »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #9 : 29-01-2004 16:37 » |
|
RXL, попробую - агромадное спасибо....
А то я совсем запутался так как в жизни на php не работал.
Теперь будет и движок бытро.
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
RXL
|
|
« Ответ #10 : 29-01-2004 20:39 » |
|
А то я совсем запутался так как в жизни на php не работал. Я тоже Главное не суетиться - от этого много ошибок
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #11 : 29-01-2004 21:48 » |
|
RXL, мда - я кстати посмотрел - не поможет. Идея такова - считать любой темплейт и с помощью preg_replace сделать замену из массива 1 на массив два, т.е. заменить значения для темпелйтов из второго массива на резкльтат работу функции из другого. Думаю, что замена на указатели мне ничего не даст, таким образом придется ставить в ручную местонахождение и с помощью switch оператора переделывать - но это некрасиво ИМХО.
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
RXL
|
|
« Ответ #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
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #14 : 30-01-2004 10:40 » |
|
А еще лучше положить все на xml/xslt
КАК - поподробнее.
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #15 : 30-01-2004 10:42 » |
|
RXL, поподробнее.
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
RXL
|
|
« Ответ #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++ »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
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
|
|
« Ответ #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.phphttp://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++ »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #20 : 01-02-2004 15:13 » |
|
Fireworm, Или тебя интересует как работает xslt вообще?
Да именно - как с парсированием XML кода я сталкивался, а вот как работа в вебе нет. Отсюда - просьба. Или тему заведи и напиши немного про это, если есть время или статейку - для меня и для сайта, по стартовым азам XML технологии в вебе.
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
Fireworm
Гость
|
|
« Ответ #21 : 02-02-2004 07:16 » |
|
Гром, Попробую... хотя таковых и хвтает в интернете...
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #22 : 02-02-2004 10:11 » |
|
Fireworm, Ок - жду.
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
|