我使用两个类:Points和Populate_Fields。 Points类包含各种点的getter:
class Points {
public function get_state_points($user_id) {
return $this->calculate_state_points($user_id);
}
public function get_region_points($user_id) {
return $this->calculate_region_points($user_id);
}
...
}
Populate_Fields类使用这些方法填充字段:
class Populate_Fields extends Points {
private function populate_state_point_value( $field ) {
$user_id = \thermal\User_Data::get_edited_user_id();
if( ! empty($user_id) ) {
$state_points = $this->get_state_points($user_id);
$field['value'] = $state_points;
update_user_meta($user_id, 'state_point_value', $state_points);
}
return $field;
}
private function populate_region_point_value( $field ) {
$user_id = \thermal\User_Data::get_edited_user_id();
$region_points = $this->get_region_points($user_id);
update_user_meta($user_id, 'region_point_value', $region_points);
$field['value'] = $region_points;
return $field;
}
}
正如您所看到的,目前Populate_Fields类扩展了Points,使这些方法在$ this下可用。但是,我不确定扩展是否是一个很好的做法:对我来说,使Populate_Fields成为Points的子项只是因为它使用了它的方法,这没有多大意义。
我想到的另一件事是将Points类的实例作为Populate_Fields类的属性:
class Populate_Fields {
private $points;
public function __construct() {
$this->points = new Points();
}
private function populate_state_point_value( $field ) {
$user_id = \thermal\User_Data::get_edited_user_id();
if( ! empty($user_id) ) {
$state_points = $this->points->get_state_points($user_id);
$field['value'] = $state_points;
update_user_meta($user_id, 'state_point_value', $state_points);
}
return $field;
}
...
}
这是一种更好的做法吗?或者,如果我使用这些方法而不是这两个类,那么将它们设置为静态是否有意义并使用如下:
class Points {
public static function get_state_points($user_id) {
return self::calculate_state_points($user_id);
}
...
}
class Populate_Fields {
private function populate_state_point_value( $field ) {
$user_id = \thermal\User_Data::get_edited_user_id();
if( ! empty($user_id) ) {
$state_points = Points::get_state_points($user_id);
$field['value'] = $state_points;
update_user_meta($user_id, 'state_point_value', $state_points);
}
return $field;
}
...
}
答案 0 :(得分:1)
使用“依赖注入”在实例化Points
时需要Populate_Fields
个实例:
class Populate_Fields {
private $points;
public function __construct(Points $pointsObj) {
$this->points = $pointsObj;
}
private function populate_state_point_value( $field ) {
$user_id = \thermal\User_Data::get_edited_user_id();
if( ! empty($user_id) ) {
$state_points = $this->points->get_state_points($user_id);
$field['value'] = $state_points;
update_user_meta($user_id, 'state_point_value', $state_points);
}
return $field;
}
...
}