2016-07-16 6 views
1

Ich verwende zwei Klassen: Punkte und Populate_Fields. Die Punkte Klasse Getter für verschiedene Punkte hat, die wie diese aussehen:PHP OOP: Eine bessere Methode Methoden in einer anderen Klasse zugänglich zu machen

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); 
    } 
    ... 
} 

Und die Populate_Fields Klasse verwendet diese Methoden Felder füllen:

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; 
    } 
} 

Wie Sie sehen können, zur Zeit erstreckt sich die Populate_Fields Klasse, um die Punkte um diese Methoden unter $ this verfügbar zu machen. Ich bin mir jedoch nicht sicher, ob das Verlängern eine gute Übung ist: Es macht für mich wenig Sinn, Populate Fields zu einem Kind von Points zu machen, nur weil es seine Methoden verwendet.

Eine andere Sache, die ich gedacht, ist eine Instanz der Point-Klasse als Eigenschaft der Populate_Fields Klasse zu machen:

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

Ist es eine bessere Praxis? Oder, wenn ich diese Methoden mehr bin mit als in diesen beiden Klassen, ist es sinnvoll, um sie stattdessen statische zu machen und wie diese verwendet:

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: Grund Coding Standard "Klassennamen müssen werden in studlyCaps erklärt", empfiehlt Sie sollten also den Unterstrich entfernen. – SandroMarques

+0

@SandroMarques Vielen Dank für Ihren Kommentar, Klassen Namen wie diese sind [WordPress Namenskonventionen] (https://make.wordpress.org/core/handbook/best-practices/coding-standards/php/#naming-conventions) . Ich werde es bei Nicht-WP-Projekten berücksichtigen. –

Antwort

1

Verwenden „Dependency Injection“ eine Points Instanz macht erforderlich, wenn Instanziieren 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

Verwandte Themen