Николай С.
710 сообщений
#16 лет назад

<?php

class rss_parser
{
private $news;
private $currentNews;
private $index;
private $file_path;
private $parser;

function parse_rss()
{
$this->parser = xml_parser_create();

xml_set_element_handler($this->parser, 'feed_start_element', 'feed_end_element');
xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, true);

$xml = file_get_contents($this->file_path);

xml_parse($this->parser, $xml, true);

xml_parser_free($this->parser);
}

function feed_start_element($p, $name, $attrs)
{
switch($name)
{
case 'CHANEL':
$this->news = array();
break;
case 'ITEM':
$this->currentNews = array();
in_array('date', array_keys($attrs));
break;
default:
$this->index = $name;
break;
}
}

function feed_end_element($p, $name)
{
if ((is_array($this->currentNews)) && ($name=='ITEM'))
{
$this->news = $this->currentNews;
$this->currentNews = null;
}

$this->index = null;
}

function get_data()
{
$this->parse_rss();
return $this->news;
}
}

?>

При работе с данным классом выскакивает ошибка "Unable to call handler feed_start_element()". Как ее побороть?
Вадим Т.
3240 сообщений
#16 лет назад
SolNikolay, у Вас же используются в качестве коллбеков методы класса, а не обычные функции. В мануале это описано. Поэтому делать нужно так:

xml_set_element_handler($this->parser, array($this, 'feed_start_element', array($this, 'feed_end_element');

Или посмотрите как это у меня сделано тут:
На форуме я писал об этом тут:
Николай С.
710 сообщений
#16 лет назад
Спасибо Чего-то где-то недочитал, видимо
Вадим Т.
3240 сообщений
#16 лет назад
Кстати, в догонку. Вот это Вы зря делаете:

$xml = file_get_contents($this->file_path);

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

        // Open XML file
if (!($f = fopen($fname, 'rb'))) {
throw new Exception(sprintf('Could not open XML input: %s!', $fname));
}

// Initialize XML parser
$x = xml_parser_create("UTF-8");
xml_parser_set_option($x, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($x, XML_OPTION_SKIP_WHITE, 1);
xml_set_element_handler($x, array($this, 'startElement'), array($this, 'endElement'));
xml_set_character_data_handler($x, array($this, 'characterData'));

// Parse XML
$err = null;
while ($data = fread($f, 4096)) {
if (!xml_parse($x, $data, feof($f))) {
$err = sprintf('XML error: %s at line %d', xml_error_string(xml_get_error_code($x)), xml_get_current_line_number($x));
break;
}
}

// Close opened descriptors and unset properties
xml_parser_free($x);
fclose($f);
Николай С.
710 сообщений
#16 лет назад
Еще раз спасибо Исправим.
Вадим Т.
3240 сообщений
#16 лет назад
SolNikolay, вот Вам и пример получился насчет нашего недавнего спора , зачем нужен сторонний эксперт в проекте. Иначе "обычный средний программист" такого накодит, что потом в продакшене проблемы будут вылезать одна за одной.

QA не сможет отливить большинство дефектов например в том же Вашем классе (хотя QA тоже необходимо! но не его цель копаться в коде), а эксперт в процессе QC сможет эмпирически, видя рисковые по его опыту куски кода, предупреждая о них, и предлагая свои решения, на порядок уменьшить даже возможность возникновения таких дефектов.
Николай С.
710 сообщений
#16 лет назад
tvv, ну, во-первых, я вообще-то тестер, а не "обычный средний программист"
Во-вторых, вы наверняка знаете про схему, когда в команде рабоют несколько программистов и роль QC выполняет другой человек из команды. То есть по кругу передали код и проверили. Это занимает даже меньше времени, чем проверка сторонним специалистом.
Вадим Т.
3240 сообщений
#16 лет назад
Цитата ("SolNikolay"):
Во-вторых, вы наверняка знаете про схему, когда в команде рабоют несколько программистов и роль QC выполняет другой человек из команды. То есть по кругу передали код и проверили. Это занимает даже меньше времени, чем проверка сторонним специалистом.

Абсолютно правильно, так и есть в типичном проекте, обязательно так нужно делать. Но этого внутреннего QC не достаточно. Причем не только потому что команда программистов варится в своем соку, и часто естественным путем разделены роли типа один лучше всех в сервер сайде, другой по клиентской части, третий по веб сервисам и т.д.

Главное - как может например заказчик минимизировать тот риск, что эту команду занесет не в ту сторону при проектировании? Что ребята обсудят за пивом архитектуру, начнут по ней что-то делать, а потом окажется что она неживая под нагрузкой? Или босс студии, который в отличие от всех остальных лично попадает под огромные штрафные санкции, как может гарантировать что его подчиненные не начнут всей командой делать не то что нужно, если тимлид этой команды глобально стормозит?

QA конечно поможет. Например, через 3 месяца разработки незадолго до дедлайна стресс-тест покажет, что система умирает на 20 одновременных клиентах. Что делать? Программеры (часть из них, которые начинали, уже уволилась к тому времени) говорят - нужно все менять. Заказчик требует деньги обратно, у него помимо всего прочего убытки от того, что проект не получится сдать в срок. Босс студии в панике, и по праву считает эту свою команду ламерами. Программеры в депрессии, особенно если у босса как минимум нет желания платить премии, или как максимум нет денег на зарплату после рефаунда денег заказчику. А все из-за того, что решили экономить мизерную сумму на внешнего эксперта-консультанта.

QA - констатирует факт, что обнаружен дефект. Программеры потом делают бесконечные заплатки, но крупных переделок они уже не делают, на это нет времени и бюджета. А вот QC (в особенности сторонний, внешний относительно команды разработчиков эксперт) позволяет сразу, заранее, на зачаточном состоянии ликвидировать большинство возможностей возникновения дефектов, даже не запуская тестов и не тратя потом времени на фикс. Конечно эти тесты нужны, QA необходимо, никто не спорит. Но QA - недостаточно. И внутреннего QC между программистами - тоже недостаточно, если цена исполнения или тем более неисполнения проекта высока.

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

(Если такого эксперта нанимает не заказчик, а босс конторы/студии, то факт подключения такого эксперта к проекту может использоваться маркетинговым отделом в тендере, при работе с заказчиком, для поднятия часового рейта, обоснования более крупного бюджета, и т.д., но сейчас речь не об этом.)
Николай С.
710 сообщений
#16 лет назад
tvv, что-то с вами теперь и не поспориш. Эээээхххх
Вадим Т.
3240 сообщений
#16 лет назад
Цитата ("SolNikolay"):
tvv, что-то с вами теперь и не поспориш. Эээээхххх

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