【问题标题】:Class methods and instance methods in codeigniter, how can I use them?codeigniter中的类方法和实例方法,我该如何使用它们?
【发布时间】:2009-11-18 02:24:31
【问题描述】:

我对 codeigniter 很陌生,但我了解 OOP 和 MVC,因为我做了很多 Rails 开发。我还没有弄清楚的一件事是如何在 codeigniter 中编写一个类级别的方法并在控制器中访问它。例如,我有

<?php
class User_model extends Model {
    function user_model()
    {
        parent::Model();
    }

    public static function get_total_users_count(){
        $results = $this->db->query("SELECT * FROM bhr_users GROUP BY userid");
        if($results){
            return $results->num_rows();
        }
        return 0;
    }
}
?>

我认为我在这里所做的是为我的模型建立了一个类级别的方法,我应该可以使用 User_model::get_total_users_count() 调用它现在在我的控制器中,以前的程序员称为“欢迎”我有类似的东西:

<?php

class Welcome extends Controller {

    function Welcome()
    {
        parent::Controller();   
        $this->load->model('bhr_model');
            $this->load->model('user_model');
    }

    function index()
    {

        $invite =    $this->uri->segment(3);
        if($invite == 'invitefriends') {
            $pagedata['invitefriends'] = $invite;
        } else {
            $pagedata['invitefriends'] = '';
        }

        $pagedata['numberofpeople'] = User_model::get_total_users_count();
        $this->load->view('default_page', $pagedata);
    }
}

上述对get_total_users_count 的方法调用不起作用,因为它说因为我在get_total_users_count 的类级函数上使用了db 方法。换句话说,当我引用一个类时,$this 没有 db 方法。

所以现在我的问题更具理论性。我一直认为只有在方法作用于类的特定实例时才应该使用实例方法。有道理,对吧?但是,get_total_users_count 作用于所有“用户”并计算它们。看起来这应该是一个类级别的方法。你同意吗?如果有,你知道我如何通过类级别函数中的框架访问数据库吗?

谢谢!

【问题讨论】:

    标签: php codeigniter


    【解决方案1】:

    由于您没有实例化 User_model,因此您必须获取 CI 实例,然后将其用于您的数据库查询。

    get_total_users_count() 内部:

    $ci_ins =& get_instance();
    $ci_ins->db->query();
    

    【讨论】:

    • 为什么投反对票?这回答了“我如何在类级函数中使用框架访问数据库”的问题
    【解决方案2】:

    您可以将您的类设为助手,这样它就不会作为实例加载。仅包含代码,因此您可以将其称为:

    $sample = class_name::method();
    

    【讨论】:

      【解决方案3】:

      CodeIgnighter 的工作原理是在您加载模型时对其进行实例化。 Thorpe Obazee 所说的是使用您的模型的正确 codeIgnighter 方式。

      您要问的是,您是否可以在大多数情况下使用您所期望的静态方法,但这不是 CI 的工作方式。

      为了完成您所追求的目标,mives 指出 get_instance() 是获取主要 CI 对象的正确方法。我自己用这种方式来做你正在做的事情。

      【讨论】:

        【解决方案4】:

        get_total_user_count 更多的是用户表网关的功能。

        用户模型应该有getUsernamegetLastLogin之类的东西。

        用户表网关应该有findUserByIdcreateNewUsergetTotalUserCount之类的东西

        【讨论】:

        • 您是否建议我为每个表添加一个网关类。我觉得我最终需要使用你的方法。我并不反对,只是看起来有点矫枉过正
        • 是的,这就是我的建议。它使事情变得更干净,也更有意义,因为您是对的,该函数不会作用于特定的用户实例。 martinfowler.com/eaaCatalog/tableDataGateway.html
        • 有趣的一点,我会考虑这样做。但是,我可以争辩说所有类级别的方法都是网关,而所有实例级别的方法都不是……而且没有必要创建两个单独的类
        【解决方案5】:
         $pagedata['numberofpeople'] = $this->user_model->get_total_users_count();
        

        这就是 CI 的方式。

        【讨论】:

        • 这并没有真正解决手头的理论问题。获取总用户数的函数未在用户实例上运行,因此它可能应该是类级别的方法
        • 那么最好的方法就是创建一个 CI 超级对象的实例
        猜你喜欢
        • 1970-01-01
        • 2012-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多