[PHP] Классы всякие тут

Discussion in 'PHP' started by Redfern89, 6 Feb 2013.

  1. Redfern89

    Redfern89 New Member

    Joined:
    12 Jul 2012
    Messages:
    42
    Likes Received:
    1
    Reputations:
    -3
    доброго времени суток уважаемые друзья :) подскажите придурку, ломающему мозг и гугл уже битых 4 часа, как организовать класс такого вида:

    PHP:
    foreach ($vk -> api('audio.get') as $line) { 
      
    $url $line -> url;
    }

    // или

    $vk -> api('audio.get'0) -> url// где 0 - номер найденной аудиозаписи
    я сделал так http://pastebin.com/EZMtsgM8

    использую так:
    PHP:
     $vk -> api('audio.get'$access_token, array('count'=>1)); 
     echo 
    $vk -> url;
    а если записей будет много? как мне привести это в вид, как описано выше?

    блджад. ненавижу ООП

    вот мой убогий код:

    PHP:
        include "config.php";
        
        class 
    vk_api {        
            
            
    // Properties
            
    public $access_token;
            public 
    $expires_in;
            public 
    $user_id;
            
            function 
    __construct() {
                if (!
    function_exists('json_decode')) {
                    die (
    'No JSON support');
                }
                if (!
    function_exists('curl_init')) {
                    die (
    'No cURL support');
                }
            }
            
            
    // Это облегчает отправку данных по http (https)
            
    private static function _send($url$use_ssl=true) {
                
    // Инициализация curl()
                
    $ch curl_init() or die ('<b>cURL initialization error</b> :: ' curl_error() );
                
                
    // Устанавливаем опции
                
    curl_setopt($chCURLOPT_URL$url);
                
    curl_setopt($chCURLOPT_HEADERfalse);
                
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
                
    curl_setopt($chCURLOPT_CONNECTTIMEOUT30);
                if (
    $use_ssl) {
                    
    curl_setopt($chCURLOPT_SSL_VERIFYPEERfalse);
                    
    curl_setopt($chCURLOPT_SSL_VERIFYHOSTfalse);
                    
    curl_setopt($chCURLOPT_VERBOSE1);
                }
                
    curl_setopt($chCURLOPT_USERAGENT'Mozilla/5.0 (PHP 5.4.11; Redfern.89; VK api 3.0)');
                
                
    // Выполняем
                
    $res curl_exec($ch) or die ('<b>cURL exec method error :: </b>' curl_error($ch) );
                
                
    // Закрываем
                
    curl_close($ch);
                
                
    // Выводим
                
    return $res;
            }
            
            
    // Получаем строку авторизации
            
    public function auth_string($scope) {
                include 
    "config.php";
                
                
    $auth 'https://oauth.vk.com/authorize?client_id='.$vk_api_id.'&scope='.$scope.'&redirect_uri='.$vk_redirect_uri.'&display=popup&response_type=code';
                
                return 
    $auth;
            }
            
            
    // Получаем access_token
            
    public function access_tokenGet($code) {
                include 
    "config.php";
                
    $query 'https://oauth.vk.com/access_token?client_id='.$vk_api_id.'&client_secret='.$vk_secret.'&code='.$code.'&redirect_uri='.$vk_redirect_uri;
                
                
    $data $this -> _send($query);
                
                
    $json json_decode($datatrue);
                
                if (isset(
    $json['error'])) { 
                    die (
    '<b>oAuth 2.0 error</b> :: ' $json['error'] . ' - ' $json['error_description']);
                }
                
                
    $this -> access_token $json['access_token'];
                
    $this -> expires_in $json['expires_in'];
                
    $this -> user_id $json['user_id'];
            }
            
            
    // Делаем запрос к API
            
    public function api($method$access_token$params null) {
                
    // Изначальная строка запроса
                
    $query 'https://api.vk.com/method/';
                
                
    // Смотрим, какие параметры у нас в запросе
                
    if (count($params) > 0) {
                    
    $query .= $method '?';
                    
                    
    // Перечисляем параметры
                    
    while (list($key$var) = each($params)) {
                        
    $query .= $key.'='.$var.'&';
                    }
                    
    $query .= 'access_token='.$access_token;
                    
    // Если дополнительных параметров нет, то делаем вызов метода без них
                
    } else {
                    
    $query .= $method '?access_token=' $access_token;
                }
                
                
    // Выводим
                
    $data $this -> _send($query);
                
    $json json_decode($datatrue);
                
                
    // проверяем на ошибки
                
    if (isset($json['error'])) {
                    die (
    '<b>vk API error (code ' $json['error']['error_code'] . ')</b> :: ' $json['error']['error_msg']);
                }
                
                foreach (
    $json['response'] as $line) {
                    for (
    $i=0$i count($line); $i++) {
                        list(
    $key$val) = each($line);
                        
    $this -> $key $val;
                    }
                }
                
            }
        
        }
     
  2. barnaki

    barnaki Elder - Старейшина

    Joined:
    2 Nov 2008
    Messages:
    676
    Likes Received:
    135
    Reputations:
    4
    ты уверен что эти методы и свойства тебе нужны публичными ? почему они не закрыты. вообще хороший тон сначала все методы делать приватными и открывать по мере надобности.
    так же нет гет и сет методов свойств класса . и раз уж ты их завел опять таки соверуют их инициализировать в конструкторе. но это если книжки брать в расчет. а лично я бы сказал что коменты на русском это жесть. поотрубал бы руки тем китайцам и испанцам чьи коменты на родном языке я встречал.
     
    #2 barnaki, 7 Feb 2013
    Last edited: 7 Feb 2013
  3. proroot

    proroot Member

    Joined:
    31 Jan 2012
    Messages:
    46
    Likes Received:
    5
    Reputations:
    0
    Зачем реализовывать всё так сложно?
     
  4. barnaki

    barnaki Elder - Старейшина

    Joined:
    2 Nov 2008
    Messages:
    676
    Likes Received:
    135
    Reputations:
    4
    чтобы потом проще и удобней пользоватся было
     
  5. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    barnaki открывать по мере необходимости - это как? Класс должен либо реализовывать интерфейс, либо нет. Изменять интерфейс находу - плохо и влечет за собой трудно предсказуемые последствия (особенно в ПХП, где никто про тесты не слышал почти)

    Redfern89 Ошибки:

    1) Инклуд вне класса, и в некоторых методах класса файла config.php - плохо
    2) die внутри методов - плохо. Да и вообще посередине кода. Лучше - собственный обработчик ошибок. Еще лучше и чище - исключения (тут могу быть не прав, не знаю всех особенностей реализации в пхп)
    3) Отсутствует проверка/логика для метода Api и параметра $params. Не гарантируется, что там будет передаваться массив это раз, и два - вы сами не можете определиться, что хотите от функции, ваш пример вызова $vk -> api('audio.get', 0) - не верен, вторым параметром должен идти токен
    4) Лапша кода в функции api. Вот этот кусок:
    PHP:
                // Смотрим, какие параметры у нас в запросе
                
    if (count($params) > 0) {
                    
    $query .= $method '?';
                    
                    
    // Перечисляем параметры
                    
    while (list($key$var) = each($params)) {
                        
    $query .= $key.'='.$var.'&';
                    }
                    
    $query .= 'access_token='.$access_token;
                    
    // Если дополнительных параметров нет, то делаем вызов метода без них
                
    } else {
                    
    $query .= $method '?access_token=' $access_token;
                } 
    Я бы переписал хотя бы так (возможно можно лучше):
    PHP:
                // Смотрим, какие параметры у нас в запросе

    $query_string = array('access_token='.urlencode($access_token));

    foreach(
    $params as $key => $value)
    {
        
    $query_string[] = urlencode($key).'='.urlencode($value);
    }
    $query implode('&'$query_string); 
    5) Вы когда использовать ту или иную конструкцию - монетку подбрасываете? Зачем в одном месте foreach а в другом while(list = each)?

    Теперь собственно про ваше, так называемое, ООП.

    1) Параметры функции API - стоило бы изменить, access_token среди параметров вам не нужен.
    2) Функцию api стоит разбить минимум на две. Первая - собирание query_string из массива params. Вторая - собственно запрос.
    3) Константы типа базовых урлов - стоит выносить в отдельное место, например в поля класса. Тогда можно будет не искать по всему коду, куда вы что подставляете

    Ну и главное - ООП позволяет выполнять один из главных принципов программирования: DRY (Don't repeat yourself), пользуйтесь этим
     
    _________________________
    #5 Gifts, 8 Feb 2013
    Last edited: 8 Feb 2013