Методы класса и методы экземпляра в codeigniter, как я могу их использовать? - PullRequest
2 голосов
/ 18 ноября 2009

Я очень новичок в codeigniter, но понимаю ООП и 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 не работает, потому что он говорит, потому что я использую метод db для функции уровня класса в get_total_users_count. Другими словами, $ this не имеет метода db, когда я ссылаюсь на класс.

Так что теперь мой вопрос немного более теоретический. Я всегда думал, что методы экземпляра следует использовать только тогда, когда метод действует на конкретный экземпляр класса. Имеет смысл, верно? Однако get_total_users_count действует на всех «пользователей» и считает их. Просто кажется, что это должен быть метод уровня класса. Ты согласен? Если да, знаете ли вы, как я могу получить доступ к базе данных из каркаса внутри функции уровня класса?

Спасибо!

Ответы [ 5 ]

7 голосов
/ 18 ноября 2009

Поскольку вы не создаете экземпляр User_model, вы должны получить экземпляр CI, а затем использовать его для своих запросов в БД.

Внутри get_total_users_count ():

$ci_ins =& get_instance();
$ci_ins->db->query();
3 голосов
/ 14 ноября 2012

Вы можете сделать свой класс помощником, чтобы он не загружался как экземпляр. Будет включен только код, поэтому вы можете назвать его так:

$sample = class_name::method();
2 голосов
/ 20 ноября 2009

CodeIgnighter работает, создавая экземпляры ваших моделей по мере их загрузки. То, что сказал Торп Обази, является правильным способом codeIgnighter использовать вашу модель.

Вы спрашиваете, можете ли вы использовать статический метод, как вы ожидаете, в большинстве случаев, что не совсем так, как работает CI.

Чтобы выполнить то, что вам нужно, mives указывает на get_instance (), который является правильным способом добраться до основного объекта CI. Я сам так делаю, чтобы делать то, что ты делаешь.

1 голос
/ 18 ноября 2009

get_total_user_count - это больше функция для шлюза пользовательских таблиц.

Модель пользователя должна иметь такие вещи, как getUsername и getLastLogin.

User Table Gateway должен иметь такие вещи, как findUserById, createNewUser и getTotalUserCount

0 голосов
/ 18 ноября 2009
 $pagedata['numberofpeople'] = $this->user_model->get_total_users_count();

Это способ CI.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...