这是一个糟糕的面向对象的PHP?

tim*_*den 0 php oop

我创建了一个包含标题,侧边栏和页脚的Display对象:

class Display {
    protected $framework;
    public $mysql;
    public function __construct() {
        $this->mysql = new MySQL();
        $this->framework .= $this->header();
        $this->framework .= $this->body();
        $this->framework .= $this->sidebar();
        $this->framework .= $this->footer();
    }
    private function header (){ /* blah */ }
    private function body (){  }
    private function sidebar (){ /* blah */ }
    private function footer (){ /* blah */ }
    public function displayPage(){
        print $this->framework;
    }
}
Run Code Online (Sandbox Code Playgroud)

在每个页面上,我创建了一个扩展Display对象的对象,其中包含body的代码:

class IndexPHP extends Display {
    public function body(){
        $this->user = new User();
        return '<div class="body">Hello ' . $this->user->getName() . '</div>';
    }
}
$page = new IndexPHP();
$page->displayPage();
Run Code Online (Sandbox Code Playgroud)

我是否通过将对象嵌套太多来创建问题?例如,在User对象中,如何访问已启动的MySQL对象?

class User {
    protected $name;
    public function __construct() {
        $this->id = /* MySQL object query here */
    }
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*ein 7

你给出的方法的问题是你没有遵循任何形式的"权力分立"原则.您的Display对象中包含一个数据库,以及如何连接它的逻辑; 这可能不是最好的方法("上帝的对象").遵循MVC(模型 - 视图 - 控制器)原则可能是一个更好的主意,其中您有一个类知道您的模型(数据库),另一个知道如何将模型转换为将呈现的对象(控制器) ,第三个实际显示数据的所有CSS优点(视图,通常只是一个PHP模板文件).

我建议你看看现有的MVC框架 - 我使用的是QCubed(http://qcu.be),还有其他的 - Symfony,Zend,CakePHP.它们都为您提供了一种干净利落地分离代码的好方法,最终实现了可维护性.