我有一个基类,它有一个名为load的属性,它是类load的对象。load类有一个名为view的函数,该函数包含页面。现在我需要打电话给
这类似于CodeIgniter的$This->load->view("test.php")
负载类别
class Load {
public function view($page){
//this function loads views to display
include($page);
}
public function model($class){
//loads model classes
}
public function library($class){
//loads libraries
}
}
基类
class Base {
function __construct(){
$this->load = new Load();
}
}
索引页面
$base = new Base();
$base->load->view("test1.php");
this1.php
echo "testing1'n";
$this->load->view("test2.php");
test2.php
echo "testing2";
输出应为
testing1
testing2
我认为你真正想要的是遵循工厂模式。(至少,如果您希望$view
变量实际包含Load
类的实例,这就是您的意思)
使构造函数受到保护,这样只有类才能创建新实例,然后在基类中添加一个静态方法,例如"factory",该方法返回所需类的实例。
然后你的代码看起来像
$view=Base::factory();
$view->view("test1.php");
注意:这个答案是在对问题进行任何编辑之前做出的。请相应地评估
您需要将函数标记为public
,以允许从定义类之外调用它们(当然这是简化的)
尝试以下操作:
class Load{
public function view($page){
include($page);
}
}
class Base{
public $load;
function __construct(){
$this->load = new Load();
}
}
(大写类名是我自己的偏好)
这应该是可行的,但从干净的OOP角度来看,这不是一个好的设计,因为Base
类的用户需要知道Load
类是如何工作的。这被称为"紧密耦合",应尽可能避免。
我建议考虑以下备选方案:
class Load{
public function view($page){
include($page);
}
}
class Base{
private $load; //note the private modifier
function __construct(){
$this->load = new Load();
}
public function view($page){
$this->load->view($page);
}
}
这样,我只需要知道Base
有一个方法view($page)
,我就不必再知道Load
做什么了。
如果将来你想更改Load类,你可以在Base
用户没有注意到的情况下进行,如果你做得对:
假设您定义了一个类:
class BetterLoad {
private function foo(){
//do something awesome
}
private function advancedView($page){
include($page);
$this->foo();
}
}
并且您希望将其合并到Base
中,而不是旧的Load中。
class Base{
private $adv_load; //note the private modifier
function __construct(){
$this->adv_load = new BetterLoad();
}
public function view($page){
$this->adv_load->advancedView($page);
}
}
就是这样。您不需要更改代码中的任何其他内容。只要继续使用旧的$base_obj->view($page)
,你就可以继续使用,甚至不会注意到变化。