php “pure” OOP:如何设计类


php "pure" OOP: how design classes?

序言:我使用F3框架(www.fatfreeframework.com)。

假设我有一个抽象类"控制器"

<?php
abstract class Controller
{
    /* F3 */
    protected $f3;
    /* DATABASE SECTION */
    protected $db_name;
    protected $db_host;
    protected $db_username;
    protected $db_password;
    function __construct()
    {
        $f3 = Base::instance();
        $this->f3 = $f3;
    }
    protected function get_db_name()
    {
        return $this->db_name;
    }
    protected function get_db_host()
    {
        return $this->db_host;
    }
    protected function get_db_username()
    {
        return $this->db_username;
    }
    protected function get_db_password()
    {
        return $this->db_password;
    }
    protected function set_db_name($db_name)
    {
        $this->db_name = $db_name;
    }
    protected function set_db_host($db_host)
    {
        $this->db_host = $db_host;
    }
    protected function set_db_username($db_username)
    {
        $this->db_username = $db_username;
    }
    protected function set_db_password($db_password)
    {
        $this->db_password = $db_password;
    }
} // /class Controller

和一个前端控制器类:

<?php
class FrontendController extends Controller
{
    public function get_view()
    {
        $this->set_db_host('localhost');
    }       
}

他的工作是管理前端网站(html,从数据库打印结果等)。

一天后,我需要 BackendController 类来管理网站的新闻(例如)。

1)我需要重写数据库连接(例如)?或者我会在控制器的结构中移动它们?

2)实际上,从第1点开始,我确实想过将它们添加到子类__construct,但当然它覆盖了抽象类__construct

3)明天我想创建一个工具箱控制器类。假设它的范围将执行一些任务(例如"从文本中提取前 X 个字符"、"根据用户设置格式化数据"),我将/可以在应用程序的其他部分重用的所有代码片段。

在这种情况下,我需要重构所有网站更改:

Controller <= FrontendController
Controller <= BackendController

Controller <= ToolboxController <= FrontendController
Controller <= ToolboxController <= BackendController

其中<=表示"扩展"?

这似乎非常非常愚蠢的问题,而且很容易,但我会理解将新功能添加到一个天生的小网站到一个大门户的逻辑过程。

你做错了。问题的根源是,你没有模型。

模型不是一个简单的类,它是一个整体的抽象层。

  • 域对象
  • 值对象
  • 数据库映射器
  • 服务

阅读这个好答案,了解它。

最后,你的目标应该是这样的

$model = new Model();
$controller = new Controller($model);
$view = new View($model);

ViewController共享相同的Model,他们得到了它。他们不知道如何获得。