За последние 24 часа нас посетили 15875 программистов и 1641 робот. Сейчас ищут 1034 программиста ...

Тупняк с передачей функции в виде параметра

Тема в разделе "Прочие вопросы по PHP", создана пользователем verybadbug, 22 июн 2009.

  1. verybadbug

    verybadbug Активный пользователь

    С нами с:
    22 июн 2009
    Сообщения:
    2
    Симпатии:
    0
    есть такой код
    Код (Text):
    1.  
    2. class ymaps {
    3.   var $key;
    4.   var $items = array();
    5.   //переменные, необходимые для парсинга
    6.   var $elements;
    7.   var $geoobject_idx;
    8.   function ymaps($key = null) {
    9.     $this->key = $key;
    10.   }
    11.   function load($geocode, $key = null) {
    12.     //собственно геокодирование
    13.     if ($key != null) { $this->key = $key; }
    14.     if ($this->key != null) {
    15.       //чистим массив гео-объектов
    16.       $this->items = array();
    17.       //определяем базовый url
    18.       $base_url = "http://geocode-maps.yandex.ru/1.x/?key={$this->key}";
    19.       //определяем url запроса, при этом кодируем адрес
    20.       $request_url = $base_url . "&geocode=" . urlencode($geocode);
    21.       //отправляем запрос, в ответ получаем xml
    22.       $data = file_get_contents($request_url);
    23.       //парсим xml
    24.       $parser = xml_parser_create();
    25.       xml_set_element_handler($parser, "ymaps::startElement", "ymaps::endElement");
    26.       xml_set_character_data_handler($parser, "ymaps::stringElement");
    27.       xml_parse($parser, $data, true);
    28.       xml_parser_free($parser);
    29.     }
    30.   }
    31.   //функции для парсинга
    32.   function startElement($parser, $name, $attrs) {
    33.     array_push($this->elements, $name);
    34.     if ($name == "GeoObject") {
    35.       $this->geoobject_idx = count($this->items);
    36.       $this->items[] = array();
    37.     }
    38.   }
    39.   function endElement($parser, $name) {
    40.     array_pop($this->elements);
    41.   }
    42.   function stringElement($parser, $str) {
    43.     $name1 = count($this->elements) > 0 ? $this->elements[count($this->elements) - 1] : "";
    44.     $name2 = count($this->elements) > 1 ? $this->elements[count($this->elements) - 2] : "";
    45.     $name3 = count($this->elements) > 2 ? $this->elements[count($this->elements) - 3] : "";
    46.     if (($name1 == "kind") && ($name2 == "GeocoderMetaData") && ($name3 == "metaDataProperty")) {
    47.       $this->items[$this->geoobject_idx]["kind"] = $str;
    48.     } elseif (($name1 == "text") && ($name2 == "GeocoderMetaData") && ($name3 == "metaDataProperty")) {
    49.       $this->items[$this->geoobject_idx]["text"] = $str;
    50.     } elseif (($name1 == "lowerCorner") && ($name2 == "Envelope") && ($name3 == "boundedBy")) {
    51.       $this->items[$this->geoobject_idx]["lowerCorner"] = $str;
    52.     } elseif (($name1 == "lowerCorner") && ($name2 == "Envelope") && ($name3 == "boundedBy")) {
    53.       $this->items[$this->geoobject_idx]["upperCorner"] = $str;
    54.     } elseif (($name1 == "pos") && ($name2 == "Point")) {
    55.       $this->items[$this->geoobject_idx]["pos"] = $str;
    56.     }
    57.   }
    58. }
    он конечно же не работает.... вызов функций ymaps::startElement, ymaps::endElement и ymaps::stringElement при парсинге происходит как общий вызов функций.. и само-собой $this->items объекта и всё остальное, что с объектом связано - недоступно....
    подскажите, если кто сталкивался, как это лечится.... или может кам-то другим путём идти тут надо?
    заранее благодарен...
     
  2. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Попробуй
    Код (Text):
    1. array('ymaps', 'startElement')
     
  3. verybadbug

    verybadbug Активный пользователь

    С нами с:
    22 июн 2009
    Сообщения:
    2
    Симпатии:
    0
    решил проблему через использование глобальной переменной...