常用方法和不同构造函数

时间:2017-05-24 14:49:40

标签: php oop design-patterns

我在自定义MVC php web应用程序中工作。 这就是我现在所拥有的:

  • 一个班级" CtrlBase"所有控制器都应该扩展。
  • 因为应用程序有三个不同的部分(应用程序(我将在这里使用“应用程序”)),这些部分独立于用户的观点,但是我拥有的3个应用程序之间共享了许多功能每个应用程序的特定控制器,扩展" CtrlBase":CtrlBaseAdmin,CtrlBaseCms,CtrlBaseWeb。
    • 在此级别应考虑的3个不同控制器之间的主要区别在于构造函数。
    • 我有一个CRUD控制器,用于在所有3个应用程序中具有相同功能的用户,除了每个应用程序根据应用程序扩展特定的基本控制器。

所有方法:索引,编辑,添加和删除对于所有三个应用程序都是相同的,但父构造函数是不同的,同一个应用程序的所有控制器都扩展了相同的父控制器。

所以我的问题是如何避免这种代码重复(三个应用程序中的所有用户控制器的索引,编辑,添加和删除功能都相同)?

由于描述不是很清楚,我正在添加一个代码演示,您可以使用它来更好地理解它。

首先,我们有一个具有所有常用功能的Base控制器:

/**
 * Controller Base
 */
class CtrlBase {

   /**
    * Class constructor
    */
   protected function __construct() {
      echo __METHOD__ . PHP_EOL;
   }

}

然后我们有三个基本控制器来扩展这个基本控制器并添加特定于每个应用程序的som内容。显然,这是由当前应用程序中的所有控制器扩展的基本控制器。所以我们有3个应用程序特定的基本控制器:

CtrlBaseAdmin.php

require_once('CtrlBase.php');

class CtrlBaseAdmin extends CtrlBase {

   function __construct() {
      parent::__construct();
      echo __METHOD__ . ": " . "processing some stuff specific to admin." . PHP_EOL;
   }

}

CtrlBaseCms.php

require_once('CtrlBase.php');

class CtrlBaseCms extends CtrlBase {

   function __construct() {
      parent::__construct();
      echo __METHOD__ . ": " . "processing some stuff specific to cms." . PHP_EOL;
   }

}

CtrlBaseWeb.php

require_once('CtrlBase.php');

class CtrlBaseWeb extends CtrlBase {

   function __construct() {
      parent::__construct();
      echo __METHOD__ . ": " . "processing some stuff specific to web." . PHP_EOL;
   }

}

这非常有效。因为我到目前为止所做的就是在父类中创建基本控制器的通用功能,并且在特定的基本控制器中保留了给定应用程序的特定功能。当我有一个特定于应用程序的控制器而没有在其他地方使用时,一切都很好:

CtrlNotCommon.php

require_once('CtrlBaseWeb.php');

class CtrlNotCommon extends CtrlBaseWeb {

   function __construct() {
      echo __METHOD__ . ": " . "This controller functionality is specific to web only and not used elsewhere. So no problem here." . PHP_EOL;
      parent::__construct();

   }

}

但现在看看这三个应用程序中具有共同功能的三个控制器:

CtrlCommonFeatureAdmin.php

require_once('CtrlBaseAdmin.php');

class CtrlCommonFeatureAdmin extends CtrlBaseAdmin {

   function __construct() {
      echo __METHOD__ . ": " . "This controller functionality is (methods index and add) common to web, admin and cms." . PHP_EOL;
      parent::__construct();  
   }

   function index() {
      echo __METHOD__ . " is a duplication of " . __FUNCTION__ . " method in CtrlCommonFeatureWeb and CtrlCommonFeatureCms." . PHP_EOL;
   }

   function add() {
      echo __METHOD__ . " is a duplication of " . __FUNCTION__ . " method in CtrlCommonFeatureWeb and CtrlCommonFeatureCms." . PHP_EOL;
   }   

}

CtrlCommonFeatureCms.php

require_once('CtrlBaseCms.php');

class CtrlCommonFeatureCms extends CtrlBaseCms {

   function __construct() {
      echo __METHOD__ . ": " . "This controller functionality (methods index and add) is  common to web, admin and cms." . PHP_EOL;
      parent::__construct();  
   }

   function index() {
      echo __METHOD__ . " is a duplication of " . __FUNCTION__ . " method in CtrlCommonFeatureAdmin and CtrlCommonFeatureWeb." . PHP_EOL;
   }

   function add() {
      echo __METHOD__ . " is a duplication of " . __FUNCTION__ . " method in CtrlCommonFeatureAdmin and CtrlCommonFeatureCms." . PHP_EOL;
   }   

}

CtrlCommonFeatureWeb.php

require_once('CtrlBaseWeb.php');

class CtrlCommonFeatureWeb extends CtrlBaseWeb {

   function __construct() {
      echo __METHOD__ . ": " . "This controller functionality is (methods index and add) common to web, admin and cms." . PHP_EOL;
      parent::__construct();  
   }

   function index() {
      echo __METHOD__ . " is a duplication of " . __FUNCTION__ . " method in CtrlCommonFeatureAdmin and CtrlCommonFeatureCms." . PHP_EOL;
   }

   function add() {
      echo __METHOD__ . " is a duplication of " . __FUNCTION__ . " method in CtrlCommonFeatureAdmin and CtrlCommonFeatureCms." . PHP_EOL;
   }   

}

正如您在此示例中所看到的那样。函数索引和添加是相同的,当我必须在其中一个中进行更改时,我必须将其复制粘贴到其他人,这些功能显然无法移动到基本控制器。

这是一个可视化的演示代码:

usagedemo.php

require_once 'CtrlNotCommon.php';
require_once 'CtrlCommonFeatureWeb.php';
require_once 'CtrlCommonFeatureAdmin.php';

$ctrlNotCommon = new CtrlNotCommon();
$ctrlCommonFeatureWeb = new CtrlCommonFeatureWeb();
$ctrlCommonFeatureWeb->index();
$ctrlCommonFeatureAdmin = new CtrlCommonFeatureAdmin();
$ctrlCommonFeatureAdmin->index();

谢谢

2 个答案:

答案 0 :(得分:0)

  1. 如果要在多个独立应用程序之间共享代码,可能可以使用基本控制器类创建自己的库,并使用composer进行依赖关系管理。如果存在相同的代码库,则会更容易,因为在这种情况下,您可以将基类保留在项目中。
  2. 您可以使用基本控制器的抽象类来组织代码,并在那里保留共享方法(它们是相同的)。
  3. 另一种方法是使用特征,因此您可以创建特征,将所有要分享的方法放在那里,然后在控制器中使用该特征。

答案 1 :(得分:-1)

你可以:

  • 创建抽象类User并实现每个User控件(UserAdmin / UserCms / UserWeb);

  • 在核心文件夹中创建控制器的核心目录,您将在所有应用程序中使用它 - 最快且编码较少;

主要的想法是一样的:大多数PHP框架不依赖于重OOP,恕我直言,它应该。如果你自己实施一个,那么给自己一个机会去做,并在将来避免头痛。

采取第二种选择,这是一种丑陋的方式。用户可以一见钟情地使用相同的方法,但是当您在另一个系统中使用时,实现的表和一些业务规则将会改变。这样做会产生很多开关和ifs来过滤当前实例想要的内容/调用它的位置。

第一个选项就是:

belongs_to

PS:将类和接口分成不同的文件。