OOP设计问题 - 避免在类似的类中重复代码?

时间:2010-12-10 22:13:43

标签: php oop design-patterns

我正在用PHP编写一堆类,用于我们正在开发的网站的服务器端部分。这些类看起来像这样:

class SomeEntity {
    // These fields are often different in different classes
    private $field1 = 0, $field2 = 0, ... ;

    // All of the classes have one of these
    static function create($field1, $field2) {
        // Do database stuff in here...
    }

    // All of the classes have similar constructors too
    function __construct($id_number) {
        // Do more database stuff in here...
    }

    // Various functions specific to this class
    // Some functions in common with other classes
}

问题是有很多这些类,它们都需要有类似的构造函数和一些常用函数,所以我理想地想编写一个超类来处理所有这些东西,以便最小化复制/粘贴上。但是,每个子类都有不同的实例变量和参数,那么设计超类的最佳方法是什么?

(或许稍微好一点,如何编写构造函数或其他函数来处理类的实例变量,但不必知道类的实例变量是什么,并按名称对它们进行硬编码?)

2 个答案:

答案 0 :(得分:4)

你可以通过一种非常通用的“实体”类型,特别是你利用各种魔术方法。

考虑这样的类(只是一些随机的方便方法来分享类似实体的类):

<?php
abstract class AbstractEntity {

  protected $properties;

  public function setData($data){
    foreach($this->properties as $p){
        if (isset($data[$p])) $this->$p = $data[$p];
    }
  }

  public function toArray(){
    $array = array();
    foreach($this->properties as $p){
       $array[$p] = $this->$p;
       //some types of properties might get special handling
       if ($p instanceof DateTime){
           $array[$p] = $this->$p->format('Y-m-d H:i:s');
       }
    }
  }

  public function __set($pname,$pvalue){
     if (! in_array($pname,$this->properties)){
        throw new Exception("'$pname' is not a valid property!");
     }
     $this->$pname = $pvalue;
  }
}


<?php

class Person extends AbstractEntity {
   protected $properties = array('firstname','lastname','email','created','modified');
}

答案 1 :(得分:0)

基本上,您将重复的任何内容分成父类或辅助类。

如果它是与对象相关的常见活动,并且适用于类似对象,则将其放在父类中并从中继承。如果此父级的子级具有相似的成员/属性但由于某种原因而命名不同,则只需编写接受参数的方法,然后在对该方法的调用中传递不同的属性名称。

如果它是与对象相关的常见活动,并且只与该对象相关,则它将成为子类中需要它的方法。

如果这是一个与所讨论的类无关的常见活动,那么您创建一个新类来管理与该活动相关的事物,并在该类中编写一个公共方法,以便其他类可以调用。