У меня есть класс, который делает экономический календарь из строки json. Единственная проблема в том, что я не знаю, следует ли мне использовать file_get_contents() (для получения данных из API) внутри моего класса __constructor() или я должен просто передать строку json в __constructor из моего блока try{...}catch{...}?
Какая практика лучше и почему?
Вот мой класс (ЭкономическийКалендарь.php) до сих пор:
class EconomicCalendar{
private $_data,
$_calendar = [];
public function __construct($url){
$this->_data = json_decode(file_get_contents($url));
}
private function make_economic_calendar(){
foreach($this->_data->events as $e){
$arr[$e->date][] = [
'title' => $e->title,
'date' => $e->date
];
}
if (is_array($arr) && count($arr) >= 1){
return (object)$arr;
} else{
throw new Exception('EC was not created');
}
}
public function get_calendar(){
$this->_calendar = $this->make_economic_calendar();
return $this->_calendar;
}
}
Вот код (ec.php), который выводит календарь:
spl_autoload_register(function($class){
require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . $class . '.php';
});
try {
$c = new EconomicCalendar('https://api.example.com/ec?token = {MY_TOKEN}');
$economic_calendar = $c->get_e_list();
} catch (Exception $e) {
exit($e->getMessage());
}
Спасибо!






Почти всегда лучше сделать операцию ввода-вывода как можно позже (или как можно меньше). Поэтому я рекомендую вам использовать «именованный конструктор», если вы хотите инициализировать данные
class EconomicCalendar {
...
public function __construct($data){
$this->_data = $data;
}
...
public static function fromUrl($url){
return new self(json_decode(file_get_contents($url)));
}
}
И использование:
$instance = EconomicCalendar::fromUrl('https://api.example.com/ec?token = {MY_TOKEN}');
Перемещение ввода-вывода и декодирования в выделенную функцию ближе к принципу единой ответственности (IO в статике, логика в экземпляре класса).
Перемещая его в статическую область видимости, извлекает его "из" класса (помещается только в тот же файл). Вы можете извлечь конструирующий объект еще дальше в другой класс, но я думаю, что это не обязательно.
Привет, @PeliCan, но разве я не должен переместить
file_get_contents()за пределы этого класса и просто отправить строку json через__constructor? Разве вызовы API внутри класса не являются плохой практикой?