PHP OOP:在另一个类中使方法可访问的更好实践

时间:2016-07-16 11:12:22

标签: php oop inheritance

我使用两个类: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;
        }
     ...
}

1 个答案:

答案 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;
    }
  ...
}

http://php-di.org/doc/understanding-di.html