【问题标题】:php include classes without using static functionsphp包含类而不使用静态函数
【发布时间】:2012-08-10 06:28:33
【问题描述】:

对不起,如果这个问题已经得到解答,我是 PHP 中的 OOP 新手。我正在尝试构建一个用于教育和测试目的的 mvc,并增加我对它的了解。我被困在某一点上,无法弄清楚。我确信这是一个简单的解决方案,但我不知道查找它的正确术语/单词是什么。

如果答案已经存在,请告诉我。

这是我想要做的:

class Load {
  public function __construct(){
  }

  public function model($file_name){
    include($file_name.'.php');
  }
}

class Home_model extends M_F_Model{
  function __construct() {
    parent::__construct();
  }

  public static function test_this_model($var){
    $result = $var.'+2';
    return $result;
  } 
}

class M_F_Controller {
  public $load;

  public function __construct(){
    $this->load = new Load();
  }
}

class Home extends M_F_Controller{
  function __construct(){
    parent::__construct();
    $this->load->model('home_model');       
  }

  function index($var){
    $result = Home_model::test_this_model($var);
    return $result;
  }
}

我想将Home_model::test_this_model(); 转换为$this->home_model->test_this_model();,而不必在Home 类中为我将来可能要包含的每个类声明home_model 的实例,并避免使用静态函数。

提前致谢,如果您需要任何进一步的信息,请告诉我。

【问题讨论】:

    标签: php model-view-controller class function static


    【解决方案1】:

    这样做有问题吗:

    $this->home_model = $this->load->model('home_model');
    

    在 Home 的构造函数内部,然后修改加载器类的 model 函数以返回一个新实例而不是只包含文件?比如:

    public function model($file_name) {
        include $file_name . '.php';
        $model = new $file_name();
        return $model;
    }
    

    (这里假设$file_name对应文件中的类名)

    【讨论】:

    • 这是可能的。谢谢你的回答。我试图将其保留为 $this->load->model('filename here');并且仍然能够做到 $this->home_model->func();但如果这是不可能的,那么这种方式是可行的。前几天刚开始学习..我试图模仿CodeIgniter而不直接复制..
    • 上次我检查 CI 是开源的。登顶也无妨:)
    • @LoganSerman ,CodeIgiter 的开放性其实很值得商榷,因为它在很大程度上是由 EllisLab 控制的。
    【解决方案2】:

    如果你是从 CodeIgniter 学习 MVC 和 OOP,那么 你做错了™。在你对 MVC 模式有相当深入的理解或 OOP 之前,你甚至不应该接触 MVC 模式,因为它相当复杂,需要你理解诸如 LoDSoCIoC 和所有 SOLID principles 之类的东西。

    模型不是类或对象。它是一层。 MVC 模式由两层组成:模型层和表示层。表示层主要由视图、控制器和模板组成,它提供用户界面并处理用户与之交互的方式。

    控制器应该负责根据用户的输入改变模型层和当前视图的状态。不适用于创建对象和渲染模板。而且他们不应该返回任何东西。

    控制器中的基本工作流程应该是:

    • 改变当前视图的状态
    • 从模型层获取结构
    • 在该结构上执行方法

    回答: 除非您想将每个控制器绑定到特定的结构,否则您将需要两行代码来处理模型层。

    你认为的“模型”实际上是domain objects,它们是模型层的一部分。你真的不应该直接访问它们,但是刚开始学习 MVC 模式的人通常会这样做。我怀疑对于您目前的水平,this answer 会提供最大的好处,但这不是我理解 MVC 模型的方式。对于高级版本,read this

    此外,手动加载每个类是相当过时的做法。从 PHP 5.1 开始,我们有了 spl_autoload_register(),它允许您创建一个共享自动加载器,当您尝试使用未知类时会触发该自动加载器。

    【讨论】:

      猜你喜欢
      • 2014-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多