首先,我对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
我想如果我能学会以正确的方式瞄准扩展课程,我可以管理剩下的......希望如此;)
答案 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();