2016-07-16 4 views
1

私は2つのクラス、PointsとPopulate_Fieldsを使用しています。ポイントクラスは、これらのように見える様々なポイントのgetterがあります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をそのメソッドを使用しているためにのみ、Pointの子にすることはあまり意味がありません。私が考え

もう一つは、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で宣言しなければなりません。" をお勧めしますアンダースコアを削除する必要があります。 – SandroMarques

+0

@SandroMarquesあなたのコメントをお寄せいただきありがとうございます。しかし、このようなクラス名は[WordPressの命名規則](https://make.wordpress.org/core/handbook/best-practices/coding-standards/php/#naming-conventions)です。 。私はWP以外のプロジェクトでもそのことを覚えています。 –

答えて

1

使用は、「依存性注入」が必要Pointsインスタンスを作るために:私はもっとこの2つのクラスに比べて、これらのメソッドを使用していた場合や、それが代わりにそれらを静的にすると、このように使用しても意味がありません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

関連する問題