好的,在过去的几周里,我的朋友(brah)和我一直致力于基于MVC的框架。但是,我们不知道加载其他类/方法的最佳方法。
首先,我们使用了“loader”,它允许我们调用我们想要的任何特定类,然后使用相应的方法(Bootstrap::$load->Base_Model()->query()
)。但是,这种方法似乎并不十分有效,因为几乎每个类/方法(大多数情况下)都必须加载另一个Controller,Model和/或View。这意味着会有很多调用Bootstrap:$load
,这使得类更长,更少有条理。
这是主要的Bootstrap类,它在索引中调用,所有内容基本上都是从这里构建的:
class Bootstrap {
public static $load;
public function __construct() {
require_once 'Slave/Base/Loader.php';
self::$load = new Loader();
$this->load = self::$load;
}
public function build() {
Bootstrap::$load->Base_Controller();
Bootstrap::$load->Controller_Pages()->load($_GET['src']);
}
}
这是我们的加载器的样子,它被设置为Bootstrap中的静态:
class Loader extends Bootstrap {
public static $classes = array();
public function __construct() {
//do nothing
}
public function __call($method, $arg = null) {
if(!is_object($this->classes[$method])) {
$url = 'Slave/' . str_replace('_', '/', $method) . '.php';
if(file_exists( $url )) {
require_once $url;
$this->classes[$method] = new $method((count($args) > 0 ? $args : null ) );
}else{
trigger_error( 'Cannot find class "'. $method.'" within "' . $url . '"', E_USER_ERROR );
}
}
return $this->classes[$model];
}
}
因此,我们决定在每个构造中为Controller,Model和View设置子类,允许我们在User Controller一侧执行类似$this->Model->User->register()
的操作。虽然,这也存在问题。如果我们在父类(即Controller)中将子类(即用户控制器)设置为parent::__construct();
,则不允许我们在子类中调用$this->User = Bootstrap:$load->Controller_User();
。
这也意味着必须调用每个类,即使该特定页面不需要。
例如,这就是我们的主要Controller类的样子:
class Base_Controller extends Bootstrap {
public $Model;
public $Validate;
public $View;
public function __construct() {
/* Call Other Classes */
$this->Model = Bootstrap::$load->Base_Model();
$this->View = Bootstrap::$load->Base_View();
/* Call Other Functions */
$this->Validate = Bootstrap::$load->Controller_Validate();
}
}
所以要明确,我们希望能够在任何类/方法中做到这样的事情:
$this->Model->query();
$this->Controller->Validate->chars($string);
..或者像这样,因为我们从Controller的角度来看它:
$this->Model->query();
$this->Validate->chars($string);
反对必须执行类似Bootstrap加载器方法的事情:
Bootstrap::$load->Base_Model()->query();
Bootstrap::$load->Controller();
Bootstrap::$load->Controller_Validate()->chars($string);
但无需在Controller,Model和View中设置每个子类。
那么,在MVC中调用方法的最佳方法是什么?任何帮助表示赞赏!
答案 0 :(得分:3)
您可能需要查看此主题:PHP spl_autoload_register for spl_autoload_register()。 我认为这是你试图在你的Bootstrap类中实现的。