Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите разобраться с кодом 
V
    Опции темы
poiuyt1234
Дата 12.2.2009, 14:19 (ссылка)    | (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 30.4.2008

Репутация: нет
Всего: нет



Код

class APIException extends Exception {}

class RPX {
    var $api_key = null;
    var $base_url = null;
    var $format = "xml";
    var $response_body = "";

    function RPX($api_key, $base_url) {
        while ($base_url[strlen($base_url) - 1] == "/") {
            $base_url = substr($base_url, 0, strlen($base_url) - 1);
        }

        $this->api_key = $api_key;
        $this->base_url = $base_url;
    }

    /*
     * Performs the 'auth_info' API call to retrieve information about
     * an OpenID authentication response.  You'll need to inspect the
     * resulting DOMDocument to get information about the response.
     * See the API documentation for details.
     *
     * https://rpxnow.com/docs
     */
    function auth_info($token) {
        return $this->apiCall("auth_info", array("token" => $token));
    }

    /*
     * Returns an array of identifier mappings for the specified
     * primary key.
     */
    public function mappings($primary_key) {
        $doc = $this->apiCall(
             "mappings", array("primaryKey" => $primary_key));

        $identifiers = array();

        $xpath = new DOMXPath($doc);
        $nodes = $xpath->query("/rsp/identifiers/identifier");

        foreach ($nodes as $identifier_node) {
          $identifiers[] = $identifier_node->textContent;
        }

        return $identifiers;
    }

    /*
     * Maps an identifier to a primary key from your application.
     * Returns null.
     */
    public function map($identifier, $primary_key) {
        $this->apiCall("map", array("primaryKey" => $primary_key,
                                    "identifier" => $identifier));
    }

    /*
     * Removes a mapping for an identifier and primary key.  Returns
     * null.
     */
    public function unmap($identifier, $primary_key) {
        $this->apiCall("unmap", array(
            "primaryKey" => $primary_key,
            "identifier" => $identifier));
    }

    /*
     * Performs an API call using the specified name and arguments
     * array.  Automatically adds your API key to the request and
     * requests an XML response.  Returns a DOMDocument or raises
     * APIException.
     */
    private function apiCall($method_name, $partial_query) {
        $partial_query["format"] = $this->format;
        $partial_query["apiKey"] = $this->api_key;

        $query_str = "";
        foreach ($partial_query as $k => $v) {
            if (strlen($query_str) > 0) {
                $query_str .= "&";
            }

            $query_str .= urlencode($k);
            $query_str .= "=";
            $query_str .= urlencode($v);
        }

        $url = $this->base_url . "/api/v2/" . $method_name;
        $response_body = $this->_post($url, $query_str);

        $api_response = $this->_parse($response_body);
        $status = $this->_getMessageStatus($api_response);

        if ($status != 'ok') {
            throw new APIException(
              sprintf("API status was not 'ok', got '%s' instead", $status));
        }

        return $api_response;
    }

    private function _getMessageStatus($parsed_response) {
        $root = $parsed_response->childNodes->item(0);
        $node = $root->attributes->getNamedItem('stat');
        return $node->value;
    }

    private function _resetPostData() {
        $this->response_data = "";
    }

    private function _writeResponseData($curl_handle, $raw) {
        $this->response_data .= $raw;
        return strlen($raw);
    }

    private function _post($url, $post_data) {
        $this->_resetPostData();

        $curl = curl_init();

        curl_setopt($curl, CURLOPT_POST, true);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_WRITEFUNCTION,
                    array(&$this, "_writeResponseData"));

        curl_exec($curl);

        $code = curl_getinfo($curl, CURLINFO_HTTP_CODE);

        if (!$code) {
            throw new APIException(
              sprintf("Error performing HTTP request: %s", curl_error($curl)));
        }

        $response_body = $this->response_data;
        $this->_resetPostData();
        curl_close($curl);

        return $response_body;
    }

    private function _parse($raw) {
        $doc = new DOMDocument;

        if (!$doc->loadXML($raw)) {
            throw new APIException("Error parsing XML response");
        }

        return $doc;
    }
}

/*
 * API methods that we can demonstrate from the command line.
 */
global $SUPPORTED_METHODS;
$SUPPORTED_METHODS = array("map", "unmap", "mappings");

/*
 * Print out usage information for this demo code.
 */
function usage() {
  global $SUPPORTED_METHODS;
  global $argv;

  print sprintf(
     "Usage: %s <> <RPX service URL> <%s> [param ...]\n",
     $argv[0], implode("|", $SUPPORTED_METHODS));

  print "API methods:\n";
  print "  map <identifier> <primary key>\n";
  print "  unmap <identifier> <primary key>\n";
  print "  mappings <primary key>\n";

  exit(1);
}

function main() {
  global $SUPPORTED_METHODS;
  global $argv;

  if (count($argv) < 3) {
    usage();
  }

  list(, $api_key, $base_url, $api_method) = $argv;

  if (!in_array($api_method, $SUPPORTED_METHODS)) {
    usage();
  }

  $rpx = new RPX($api_key, $base_url);
  $parameters = array_slice($argv, 4);

  try {
      $result = call_user_func_array(array($rpx, $api_method), $parameters);
  } catch (APIException $e) {
      print "Error encountered while trying to perform API request:\n";
      print $e->getMessage()."\n";
      exit(1);
  }

  if ($result !== null) {
    print sprintf("Result of '%s' API call:\n", $api_method);
    print_r($result);
  }

  


}

main();





Возникли вот такие вопросы. Здесь постоянно используется $this:
Цитата


        $this->api_key = $api_key;
        $this->base_url = $base_url;

Цитата

function auth_info($token) {
        return $this->apiCall("auth_info", array("token" => $token));
    }

Цитата

private function apiCall($method_name, $partial_query) {
        $partial_query["format"] = $this->format;
        $partial_query["apiKey"] = $this->api_key;

Цитата

 private function _post($url, $post_data) {
        $this->_resetPostData();


Что  означает в каждом из приведенных случаев? Особенно не понимаю вот это: 
Цитата
 $partial_query["format"] = $this->format;
        $partial_query["apiKey"] = $this->api_key;
 Что здесь делается?? И от куда что берется??


Потом..
Цитата

$argv

От куда берется эта переменная? точнее ее значения?

Цитата

$result !== null
 Это значит "неэквивалентно"? А почему != поставить нельзя?

Цитата

($base_url[strlen($base_url) - 1] == "/")

$base_url - это типа переменная с url-лом.. а почему она вдруг в массив превращается??
И вот это участок код тоже не понятен:

Цитата

$result = call_user_func_array(array($rpx, $api_method), $parameters);
  } catch (APIException $e) {


Что такое $e и что за параметры передаюся в функцию call_user_func_array? и что именно она запускает?

Еще часть функций здесь просто объявлены, часть public часть private. Как это влияет на  их взаимодействие?




PM MAIL   Вверх
enof
Дата 12.2.2009, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 837
Регистрация: 23.1.2009
Где: Санкт-Петербург

Репутация: 30
Всего: 35



poiuyt1234, Берите учебник по php читайте. Там есть ответы на каждый ваш вопрос.
PM MAIL ICQ Skype   Вверх
lelik133
Дата 12.2.2009, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 517
Регистрация: 5.2.2003
Где: Москва

Репутация: 5
Всего: 14



советую почитать книгу по основам ООП, многие вопросы отпадут...
PM ICQ   Вверх
pizzz
Дата 12.2.2009, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 238
Регистрация: 14.12.2008
Где: Омск

Репутация: 6
Всего: 8



Слишком большой вопрос. 

Если Вы не знаете что такое $this то в обьяснение возникнут слова не понятные Вам, просто почитайте про ООП и все станет на свои места.

Объектно-ориентированное_программирование
--------------------
Спасибо много, жмем кнопку репутация.  Извините меня за орфографические ошибки, я стараюсь не ошибаться, а они все равно просачиваются гады.     
PM MAIL ICQ   Вверх
enof
Дата 12.2.2009, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 837
Регистрация: 23.1.2009
Где: Санкт-Петербург

Репутация: 30
Всего: 35



lelik133pizzz, у тс проблеы не только с ООП, вопросы даже по основам php.
PM MAIL ICQ Skype   Вверх
poiuyt1234
Дата 12.2.2009, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 30.4.2008

Репутация: нет
Всего: нет



да я читал..  если читаю пример по какому-то элементу, функции php с объяснениями то вообщем понятно.. а вот  ООП в php едва понимаю примеры с объяснениями.. а въехать в какой-нить код как апримере не могу.
PM MAIL   Вверх
enof
Дата 12.2.2009, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 837
Регистрация: 23.1.2009
Где: Санкт-Петербург

Репутация: 30
Всего: 35



Цитата(poiuyt1234 @  12.2.2009,  18:04 Найти цитируемый пост)
да я читал

оно и видно.
Цитата(poiuyt1234 @  12.2.2009,  18:04 Найти цитируемый пост)
въехать в какой-нить код как апримере не могу. 

Может все-таки сначала стоит почитать учебник, а потом уже пытаться въезжать?

PM MAIL ICQ Skype   Вверх
poiuyt1234
Дата 12.2.2009, 18:23 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 30.4.2008

Репутация: нет
Всего: нет



еще очень тяжело прослеживать данные.. т.е. значения всех переменных.. приходится весь код обвешивать var_dump, print_r, echo что б видеть что в каждой  переменной массиве на данном этапе.. и потом мучительно пытаюсь понять, а почему тут такие значения получается?.. читаю описание и примеры из учебников,  и кажется что  тут другое должно получится..

Добавлено через 10 секунд
еще очень тяжело прослеживать данные.. т.е. значения всех переменных.. приходится весь код обвешивать var_dump, print_r, echo что б видеть что в каждой  переменной массиве на данном этапе.. и потом мучительно пытаюсь понять, а почему тут такие значения получается?.. читаю описание и примеры из учебников,  и кажется что  тут другое должно получится..

Добавлено через 15 секунд
еще очень тяжело прослеживать данные.. т.е. значения всех переменных.. приходится весь код обвешивать var_dump, print_r, echo что б видеть что в каждой  переменной массиве на данном этапе.. и потом мучительно пытаюсь понять, а почему тут такие значения получается?.. читаю описание и примеры из учебников,  и кажется что  тут другое должно получится..

Добавлено через 3 минуты и 46 секунд
еще очень тяжело прослеживать данные.. т.е. значения всех переменных.. приходится весь код обвешивать var_dump, print_r, echo что б видеть что в каждой  переменной массиве на данном этапе.. и потом мучительно пытаюсь понять, а почему тут такие значения получается?.. читаю описание и примеры из учебников,  и кажется что  тут другое должно получится.. 
PM MAIL   Вверх
Sentox
Дата 12.2.2009, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


как то так
**


Профиль
Группа: Участник
Сообщений: 392
Регистрация: 27.1.2009
Где: Зимбабве

Репутация: 7
Всего: 7



Цитата(poiuyt1234 @ 12.2.2009,  18:23)
еще очень тяжело прослеживать данные.. т.е. значения всех переменных.. приходится весь код обвешивать var_dump, print_r, echo что б видеть что в каждой  переменной массиве на данном этапе.. и потом мучительно пытаюсь понять, а почему тут такие значения получается?.. читаю описание и примеры из учебников,  и кажется что  тут другое должно получится..

Добавлено @ 18:23
еще очень тяжело прослеживать данные.. т.е. значения всех переменных.. приходится весь код обвешивать var_dump, print_r, echo что б видеть что в каждой  переменной массиве на данном этапе.. и потом мучительно пытаюсь понять, а почему тут такие значения получается?.. читаю описание и примеры из учебников,  и кажется что  тут другое должно получится..

Добавлено @ 18:23
еще очень тяжело прослеживать данные.. т.е. значения всех переменных.. приходится весь код обвешивать var_dump, print_r, echo что б видеть что в каждой  переменной массиве на данном этапе.. и потом мучительно пытаюсь понять, а почему тут такие значения получается?.. читаю описание и примеры из учебников,  и кажется что  тут другое должно получится..

Добавлено @ 18:27
еще очень тяжело прослеживать данные.. т.е. значения всех переменных.. приходится весь код обвешивать var_dump, print_r, echo что б видеть что в каждой  переменной массиве на данном этапе.. и потом мучительно пытаюсь понять, а почему тут такие значения получается?.. читаю описание и примеры из учебников,  и кажется что  тут другое должно получится..

Блин а не легче ли в отладчике всё просматривать!!!???
PM MAIL   Вверх
poiuyt1234
Дата 12.2.2009, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 30.4.2008

Репутация: нет
Всего: нет



вообщем как я понял никто мне не объяснит что означает $this в данных случаях... smile 
PM MAIL   Вверх
poiuyt1234
Дата 12.2.2009, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 30.4.2008

Репутация: нет
Всего: нет




Читаем мануал:
Цитата

Описание
mixed call_user_func_array ( callback $function [, array $param_arr ] )

Вызывает пользовательскую функцию function , с параметрами из массива param_arr . 



И как тогда понимать вот это:
Цитата

$result = call_user_func_array(array($rpx, $api_method), $parameters);

array($rpx, $api_method) - это массив из объекта и переменной.. и где здесь пользовательская функция??

PM MAIL   Вверх
krundetz
Дата 12.2.2009, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



Цитата(poiuyt1234 @  12.2.2009,  21:04 Найти цитируемый пост)
вообщем как я понял никто мне не объяснит что означает $this в данных случаях... 

$this здесь как и в любом классе PHP начиная с 5 версии означает, идет обращение к  свойству или методу класса
Цитата(poiuyt1234 @  12.2.2009,  14:19 Найти цитируемый пост)
Это значит "неэквивалентно"? А почему != поставить нельзя?

так надежнее
Цитата(poiuyt1234 @  12.2.2009,  14:19 Найти цитируемый пост)
$base_url - это типа переменная с url-лом.. а почему она вдруг в массив превращается??

$base_url это строка, а в PHP ее можно представить как массив символов, что здесь и делается
Цитата(poiuyt1234 @  12.2.2009,  14:19 Найти цитируемый пост)
Еще часть функций здесь просто объявлены, часть public часть private. Как это влияет на  их взаимодействие?

public означает что обратиться к данному свойству или методу класса можно извне класса
private означает что обратиться к данному свойству или методу класса можно только из самого класса

poiuyt1234 почитай книгу хотя бы вот эту

Это сообщение отредактировал(а) krundetz - 12.2.2009, 22:29


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
bars80080
Дата 12.2.2009, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



Цитата(poiuyt1234 @  12.2.2009,  20:04 Найти цитируемый пост)
вообщем как я понял никто мне не объяснит что означает $this в данных случаях

значит фиговый учебник попался. 

ладно, попробуем на пальцах:

$this - дословно "этот". когда мы используем класс:

Код

$P = new myClass();


то обращение к методам и свойствам этого класса происходит с помощью оператора ->:

Код

$P->svojstvo1;
$P->metod1();


если же нам надо обратиться к этим свойствам и методам внутри самого класса (в том коде что ты привёл), то делается это через оператор $this:

Код

$this->svojstvo1;
$this->metod1();


т.е.
Цитата(poiuyt1234 @  12.2.2009,  13:19 Найти цитируемый пост)
$partial_query["format"] = $this->format;
        $partial_query["apiKey"] = $this->api_key;

 Что здесь делается?? И от куда что берется??

дословно: элементу format массива partial_query присвоить значение свойства format этого класса,
элементу apiKey массива partial_query присвоить значение свойства api_key этого класса

Цитата(poiuyt1234 @  12.2.2009,  13:19 Найти цитируемый пост)
$argv

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


Цитата(poiuyt1234 @  12.2.2009,  13:19 Найти цитируемый пост)
$result !== null

 Это значит "неэквивалентно"? А почему != поставить нельзя?
значит условия задачи такие.
есть два типа сранения == и ===, соответственно "не равно": != и !==
== - сравнение значений, === строгое сравнение с типами переменных. т.е. 3 == '3' (true), 3 === '3' (false)

Цитата(poiuyt1234 @  12.2.2009,  13:19 Найти цитируемый пост)
($base_url[strlen($base_url) - 1] == "/")

$base_url - это типа переменная с url-лом.. а почему она вдруг в массив превращается??

не вижу массива. вижу переменную у которой выбирают последний символ. $string = 'qwer'; значит $string[0] == 'q';


Цитата(poiuyt1234 @  12.2.2009,  13:19 Найти цитируемый пост)
Еще часть функций здесь просто объявлены, часть public часть private. Как это влияет на  их взаимодействие?

внутреннее видение разных методов класса. те что public - существуют для внешнего использования, т.е. к ним можно обратиться: $P->metod1(); , те что private для внутреннего, так обратиться не получится
PM MAIL WWW   Вверх
Sentox
Дата 12.2.2009, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


как то так
**


Профиль
Группа: Участник
Сообщений: 392
Регистрация: 27.1.2009
Где: Зимбабве

Репутация: 7
Всего: 7



Цитата

вообщем как я понял никто мне не объяснит что означает $this в данных случаях... 

Есть область в оперативной памяти где резервируется место под класс с его атрибутами и методами, вот это $this и хранит ссылку на эту область, которую и используют для обращения внутри класса. 

Цитата


И как тогда понимать вот это:

$result = call_user_func_array(array($rpx, $api_method), $parameters);

array($rpx, $api_method) - это массив из объекта и переменной.. и где здесь пользовательская функция??


это массив из объекта и метода  а это и есть функция в классе!

Это сообщение отредактировал(а) Sentox - 12.2.2009, 22:48
PM MAIL   Вверх
poiuyt1234
Дата 13.2.2009, 20:49 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 30.4.2008

Репутация: нет
Всего: нет



Всем огромное спасибо за подробные объяснения!  smile 
А проблема была в том, что мне почему-то показалось что в указанный класс  входила только первая функция. невнимательно посмотрел фигурные скобки. и сидел как незнаю кто два дня.. ничего не понимая. достаточно было вставить код в phpeditor и у видеть пары закрывающих/открывающих скобок. 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1005 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.