2016-07-16 117 views
1

我使用了两个类:Points和Populate_Fields。点类有不同的点干将看起来像这些:PHP OOP:一种更好的方法可以在另一个类中访问

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类扩展点使这些方法在$ this下可用。但是,我不确定扩展是否是一个很好的做法:将Populate_Fields设置为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

PSR-1:基本编码标准建议 “类名必须在StudlyCaps声明”所以你应该删除de下划线。 – SandroMarques

+0

@SandroMarques感谢您的评论,但是,像这样的类名是[WordPress的命名约定](https://make.wordpress.org/core/handbook/best-practices/coding-standards/php/#naming-conventions) 。我会考虑非WP项目。 –

回答

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

相关问题