PHP: Является ли плохой практикой использование file_get_contents () в классе __constructor? - PullRequest
1 голос
/ 16 июня 2019

У меня есть класс, который делает экономический календарь из строки json. Единственная проблема в том, что я не знаю, должен ли я использовать file_get_contents() (чтобы получить данные из API) внутри моего класса __constructor(), или мне просто нужно передать строку json в __constructor из моего try{...}catch{...} блок

Какая практика лучше и почему?

Вот мой класс ( EconomicCalendar.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());
}

Спасибо!

1 Ответ

2 голосов
/ 16 июня 2019

Почти всегда лучше выполнять операции ввода-вывода как можно позже (или как можно меньше). Поэтому я рекомендую вам использовать «именованный конструктор», если вы хотите инициализировать с данными

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}');

Перемещение ввода-вывода и декодирования в выделенную функцию ближе к принципу единой ответственности (ввод-вывод в статическом режиме, логика в экземпляре класса).

...