PHP:在 class __constructor 中使用 file_get_contents() 是一种不好的做法吗?
PHP: Is it a bad practice to use file_get_contents() in a class __constructor?
我有一个 class 可以用 json 字符串制作经济日历。唯一的问题是我不知道我是否应该在我的 class __constructor()
中使用 file_get_contents()
(从 api 获取数据)或者我应该通过json 从我的 try{...}catch{...}
块到 __constructor
的字符串?
哪种做法更好,为什么?
这是我的 class(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());
}
谢谢!
几乎总是让 IO 操作越晚(或越少)越好。所以我建议你使用 "named constructor" 如果你想用数据
初始化
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 和解码移至专用函数更接近单一职责原则(静态 IO,class 实例逻辑)。
我有一个 class 可以用 json 字符串制作经济日历。唯一的问题是我不知道我是否应该在我的 class __constructor()
中使用 file_get_contents()
(从 api 获取数据)或者我应该通过json 从我的 try{...}catch{...}
块到 __constructor
的字符串?
哪种做法更好,为什么?
这是我的 class(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());
}
谢谢!
几乎总是让 IO 操作越晚(或越少)越好。所以我建议你使用 "named constructor" 如果你想用数据
初始化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 和解码移至专用函数更接近单一职责原则(静态 IO,class 实例逻辑)。