class ymaps {
var $key;
var $items = array();
//переменные, необходимые для парсинга
var $elements;
var $geoobject_idx;
function ymaps($key = null) {
$this->key = $key;
}
function load($geocode, $key = null) {
//собственно геокодирование
if ($key != null) { $this->key = $key; }
if ($this->key != null) {
//чистим массив гео-объектов
$this->items = array();
//определяем базовый url
$base_url = "http://geocode-maps.yandex.ru/1.x/?key={$this->key}";
//определяем url запроса, при этом кодируем адрес
$request_url = $base_url . "&geocode=" . urlencode($geocode);
//отправляем запрос, в ответ получаем xml
$data = file_get_contents($request_url);
//парсим xml
$parser = xml_parser_create();
xml_set_element_handler($parser, "ymaps::startElement", "ymaps::endElement");
xml_set_character_data_handler($parser, "ymaps::stringElement");
xml_parse($parser, $data, true);
xml_parser_free($parser);
}
}
//функции для парсинга
function startElement($parser, $name, $attrs) {
array_push($this->elements, $name);
if ($name == "GeoObject") {
$this->geoobject_idx = count($this->items);
$this->items[] = array();
}
}
function endElement($parser, $name) {
array_pop($this->elements);
}
function stringElement($parser, $str) {
$name1 = count($this->elements) > 0 ? $this->elements[count($this->elements) - 1] : "";
$name2 = count($this->elements) > 1 ? $this->elements[count($this->elements) - 2] : "";
$name3 = count($this->elements) > 2 ? $this->elements[count($this->elements) - 3] : "";
if (($name1 == "kind") && ($name2 == "GeocoderMetaData") && ($name3 == "metaDataProperty")) {
$this->items[$this->geoobject_idx]["kind"] = $str;
} elseif (($name1 == "text") && ($name2 == "GeocoderMetaData") && ($name3 == "metaDataProperty")) {
$this->items[$this->geoobject_idx]["text"] = $str;
} elseif (($name1 == "lowerCorner") && ($name2 == "Envelope") && ($name3 == "boundedBy")) {
$this->items[$this->geoobject_idx]["lowerCorner"] = $str;
} elseif (($name1 == "lowerCorner") && ($name2 == "Envelope") && ($name3 == "boundedBy")) {
$this->items[$this->geoobject_idx]["upperCorner"] = $str;
} elseif (($name1 == "pos") && ($name2 == "Point")) {
$this->items[$this->geoobject_idx]["pos"] = $str;
}
}
}
Тупняк с передачей функции в виде параметра
Код:
он конечно же не работает.... вызов функций ymaps::startElement, ymaps::endElement и ymaps::stringElement при парсинге происходит как общий вызов функций.. и само-собой $this->items объекта и всё остальное, что с объектом связано - недоступно....
подскажите, если кто сталкивался, как это лечится.... или может кам-то другим путём идти тут надо?
заранее благодарен...
Чё-то там такое вроде self::$staticvar что ли...