从兄弟扩展类(PHP OOP)访问扩展类方法

时间:2015-08-20 19:14:00

标签: php oop model-view-controller

首先,我对OOP和使用MVC都比较新,所以如果我不使用正确的术语或者我似乎感到困惑(因为我是,哈哈),我会道歉。

我将尽可能基本开始,如果您需要更多信息,请告诉我。

我正在使用Panique的MVC(版本巨大) https://github.com/panique/huge

所以这里什么都没有!

我有一个像这样设置的基本控制器类......

控制器

<?php
class Controller {

    public $View;

    function __construct() {
        $this->View = new View();
    }

}
?>

使用这样的扩展控制器类(我将在这里显示两个)

的IndexController     

class IndexController extends Controller {

    public function __construct() {
        parent::__construct();
    }

    public function index() {
        $this->View->render('index');
    }
}

?>

ProfileController可     

class ProfileController extends Controller {

    public function __construct() {
        parent::__construct();
    }

    public function profile() {
        $this->View->render('profile');
    }
}

?>

我的问题是,当两个具有相同的父类时,在另一个扩展类方法中使用扩展类方法需要什么(如果可能的话)。有点像...

<?php

class ProfileController extends Controller {

    public function __construct() {
        parent::__construct();
    }

    public function profile() {
        $this->IndexController->index(); //Here I would like to use the method from the IndexController
    }
}

?>

我已经尝试了许多尝试来完成这项工作,但我认为我缺乏使用OOP的知识会阻碍我。似乎除了少数情况外,我尝试的大部分内容都会引发错误......

Fatal error: Class 'IndexController' not found in blah/blah/ProfileController.php

我想如果我能学会以正确的方式瞄准扩展课程,我可以管理剩下的......希望如此;)

2 个答案:

答案 0 :(得分:1)

这样做并不容易或优雅。您需要在类中实例化需要借用代码的其他类,这可能会在您的应用程序中引起许多副作用。

可能有其他方法可以做到这一点,这也取决于框架的可能性/局限性,但从PHP中的OOP角度思考,忽略其他因素,最好的方法是实现共享代码Controller类的一个方法:

<?php
  class Controller {

      public $View;

      function __construct() {
          $this->View = new View();
      }

      protected function myCustomCode() {
        ...
      }
  }
?>

然后在后代上正常调用它:

<?php
  class IndexController extends Controller {

    public function __construct() {
        parent::__construct();
    }

    public static function index() {
        $this->myCustomCode();
        $this->View->render('index');
    }
}

?>



<?php

class ProfileController extends Controller {

    public function __construct() {
        parent::__construct();
    }

    public function profile() {
        $this->myCustomCode();
        ...whatever...
    }
}

?>

我没有看到更好的方法。此外,这是OOP的自然方式,其中常见的东西是类层次结构(祖先),从不横向或向下(后代)。这有助于保持代码合理且易于维护。

答案 1 :(得分:0)

包含IndexController类的文件:

require_once('IndexController.php');
$this->controller = new IndexController();

然后调用方法

$this->IndexController->index();