我是codeigniter的新手,但是我在做很多Rails开发时理解OOP和MVC。我还没想到的一件事是如何在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()
调用现在在我的控制器中,前一个程序员称为“欢迎”我有类似的东西: / p>
<?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
正在对所有“用户”进行操作并对其进行计数。它似乎应该是一个类级别的方法。你同意吗?如果这样做,你知道如何通过在类级函数中使用框架来访问数据库吗?
谢谢!
答案 0 :(得分:7)
由于您没有实例化User_model,您必须获取CI实例,然后将其用于数据库查询。
在get_total_users_count()中:
$ci_ins =& get_instance();
$ci_ins->db->query();
答案 1 :(得分:3)
您可以将您的类作为帮助程序,以便它不会作为实例加载。只包含代码,因此您可以将其称为:
$sample = class_name::method();
答案 2 :(得分:2)
CodeIgnighter的工作原理是在加载模型时实例化它们。 Thorpe Obazee所说的是使用你的模型的正确的代码更明智的方法。
您要问的是,您是否可以在大多数情况下使用静态方法,而不是CI的工作方式。
为了完成你所追求的目标,mives指出了get_instance(),这是获取主CI对象的正确方法。我自己用这种方式去做你正在做的事情。
答案 3 :(得分:1)
get_total_user_count
更多是用户表网关的功能。
用户模型应包含getUsername
和getLastLogin
等内容。
用户表网关应包含findUserById
,createNewUser
和getTotalUserCount
答案 4 :(得分:0)
$pagedata['numberofpeople'] = $this->user_model->get_total_users_count();
这就是CI方式。