доброго времени суток уважаемые друзья подскажите придурку, ломающему мозг и гугл уже битых 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($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); if ($use_ssl) { curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_VERBOSE, 1); } curl_setopt($ch, CURLOPT_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($data, true); 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($data, true); // проверяем на ошибки 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; } } } }
ты уверен что эти методы и свойства тебе нужны публичными ? почему они не закрыты. вообще хороший тон сначала все методы делать приватными и открывать по мере надобности. так же нет гет и сет методов свойств класса . и раз уж ты их завел опять таки соверуют их инициализировать в конструкторе. но это если книжки брать в расчет. а лично я бы сказал что коменты на русском это жесть. поотрубал бы руки тем китайцам и испанцам чьи коменты на родном языке я встречал.
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), пользуйтесь этим