Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP类:我应该使用2个类还是1个类?_Php_Class_Drupal - Fatal编程技术网

PHP类:我应该使用2个类还是1个类?

PHP类:我应该使用2个类还是1个类?,php,class,drupal,Php,Class,Drupal,我目前正在尝试制作一个用PHP(Drupal)处理调查的类。 到目前为止,我有: class Survey{ public $id; public $uid; public $rate; public $reason; public $complete; public $opinion; public function save(){ drupal_write_record('survey', $this); } } 这很好,我可以创建一个新的测量实

我目前正在尝试制作一个用PHP(Drupal)处理调查的类。 到目前为止,我有:

class Survey{

  public $id;
  public $uid;
  public $rate;
  public $reason;
  public $complete;
  public $opinion;

  public function save(){
    drupal_write_record('survey', $this);
  }
}
这很好,我可以创建一个新的测量实例,设置属性,并调用save

然而,我也希望能够有方法从DB检索这些调查的结果,并根据这些结果采取行动,给我提供各种数字。在类
调查中使用这些方法是不对的,因为它们实际上是多个调查。但是,它们是相关的,也可能返回
调查
的实例,因此不确定它们是否应该是一个完全独立的类。在这里做什么最好

顺便说一句,我不在乎这是不是一个令人沮丧的回答

谢谢,
Amshad

与其他方法一样,有许多方法各有优缺点

我(当前)的偏好是将类方法(静态)和对象方法结合起来,分别处理对象组和单个对象

考虑以下代码:

class Survey {
    public $id;
    public $uid;
    public $rate;
    public $reason;
    public $complete;
    public $opinion;

    public function save()
    {
        drupal_write_record('survey', $this);
    }
    /**
     * Loads survey from secondary storage
     * 
     * @param string $id Unique surevy ID
     */
    public function load( $id ) {
        // loads a survey from secondary storage
    }
    /**
     * Returns report of survey results.
     * 
     * @param array $surveys array of surveys to process. If not passed or NULL,
     *     The whole set of completed surveys will be processed.
     * @return string HTML Formatted report
     */
    public static function compile_results( $surveys = NULL )
    {
        if( empty( $surveys ) )
        {
            $surveys = self::get_completed_results();
        }
        foreach( $surveys as &$survey )
        {
            // process an individual survey, possibly aggregating it
        } 
    }
    /**
     * Retreives completed surveys from secondary storage.
     * 
     * @return array  Array of completed Survey objects
     */
    public static function get_completed_surveys()
    {
        $surveys = array();
        // Select all surveys from secondary storage
        $survey_rows = array(); //replace with code to get surveys
        foreach( $survey_rows as $survey_row )
        {
            $survey = new Survey();
            $survey['id']       = $survey_row['id'];
            $survey['uid']      = $survey_row['uid'];
            $survey['rate']     = $survey_row['rate'];
            $survey['reason']   = $survey_row['reason'];
            $survey['complete'] = $survey_row['complete'];
            $survey['opinion']  = $survey_row['opinion'];

            $surveys[] = $survey;
        }
        return $surveys;
    } 
}
可以使用静态方法处理对象组。您甚至可以拥有一个静态数组,其中包含对每个已加载测量的引用


另一个选择是有一个“Surveys”类,其目的是处理调查组。我觉得前面的方法更干净。

使用一个类来保存业务逻辑中的两个数据库逻辑违反了这一原则。我将使用一个单独的接口和类,比如说
SurveyRepository
(接口)和
DrupalSurveyRepository
(使用Drupal DB层的接口实现),来管理调查持久性(即对数据库的读写)。这将简化(单元)测试,因为当与一些依赖项注入相结合以提供
SurveyRepository
接口的模拟实现时,您将能够在没有数据库连接的情况下访问与调查相关的代码


一个Drupal 7 +项目,我会考虑用一个实体来帮助调查一个实体类型(参见)。然后可以使用搜索调查,而加载和保存可以使用现有的和功能完成。

我认为您需要改进您的问题标题。是的,我不确定标题是什么,有什么建议吗?在阅读(特别是从搜索的链接)时,您的问题必须反映技术(语言或平台)。