CodeIgniter中的自定义类

Ind*_*dex 18 php codeigniter

对于使用CodeIgniter的初学者来说,这似乎是一个非常常见的问题,但到目前为止我找到的解决方案似乎与我的问题无关.就像主题所说我试图在CodeIgniter中包含一个自定义类.

我正在尝试创建下面类的几个对象并将它们放在一个数组中,因此我需要该类可用于模型.

我已经使用load(库 - >负载("MyClass的")函数中的CodeIgniter哪种类型的作品的尝试,但它试图创建模型外第一类的对象.这显然是一个问题,因为构造函数需要几个参数.

到目前为止我找到的解决方案是

  1. 一个简单的PHP包括看起来很好,但由于我是CodeIgniter的新手,我想确保尽可能地坚持它.
  2. 按照这里的建议创建一个"包装类" ,但我不确定如何实现它.

我想要包含的类, User.php

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); 
class User{
    public $ID = 0;
    public $username = 0;
    public $access_lvl = 0;
    public $staff_type = 0;
    public $name = 0;    

    public function __construct($ID, $username, $access_lvl, $staff_type, $name) 
    {
        $this->ID = $ID;
        $this->username = $username;
        $this->access_lvl = $access_lvl;
        $this->staff_type = $staff_type;
        $this->name = $name;
    }

    public function __toString() 
    {
        return $this->username;
    }
}
?>
Run Code Online (Sandbox Code Playgroud)

方法(Model)需要User.php

function get_all_users()
{
    $query = $this->db->get('tt_login');
    $arr = array();

    foreach ($query->result_array() as $row)
    {
        $arr[] = new User
        (
            $row['login_ID'],
            $row['login_user'],
            $row['login_super'],
            $row['crew_type'],
            $row['login_name']
        );
    }    

    return $arr;
}
Run Code Online (Sandbox Code Playgroud)

最后控制器,

function index()
{
        $this->load->library('user');
        $this->load->model('admin/usersmodel', '', true);            

        // Page title
        $data['title'] = "Some title";
        // Heading
        $data['heading'] = "Some heading";
        // Data (users)
        $data['users'] = $this->usersmodel->get_all_users();
Run Code Online (Sandbox Code Playgroud)

Pet*_*nes 17

如果你有PHP版本> = 5.3,你可以使用命名空间自动加载功能.

库文件夹中的简单自动加载器库.

<?php
class CustomAutoloader{

    public function __construct(){
        spl_autoload_register(array($this, 'loader'));
    }

    public function loader($className){
        if (substr($className, 0, 6) == 'models')
            require  APPPATH .  str_replace('\\', DIRECTORY_SEPARATOR, $className) . '.php';
    }

}
?>
Run Code Online (Sandbox Code Playgroud)

模型目录中的User对象.(models/User.php)

<?php 
namespace models; // set namespace
if ( ! defined('BASEPATH')) exit('No direct script access allowed'); 
class User{
 ...
}
Run Code Online (Sandbox Code Playgroud)

而不是新用户... 新模型\用户(...)

function get_all_users(){
    ....
    $arr[] = new models\User(
    $row['login_ID'],
    $row['login_user'],
    $row['login_super'],
    $row['crew_type'],
    $row['login_name']
    );
    ...
}
Run Code Online (Sandbox Code Playgroud)

在控制器中,请务必按照以下方式调用customautoloader:

function index()
{
        $this->load->library('customautoloader');
        $this->load->model('admin/usersmodel', '', true);            

        // Page title
        $data['title'] = "Some title";
        // Heading
        $data['heading'] = "Some heading";
        // Data (users)
        $data['users'] = $this->usersmodel->get_all_users();
Run Code Online (Sandbox Code Playgroud)


Nic*_*aag 6

CodeIgniter并不真正支持真正的对象.所有的图书馆,模型等都像单身人士.

有两种方法可以使用,而无需更改CodeIgniter结构.

  1. 只需包含包含该类的文件,然后生成它.

  2. 使用load-> library或load_class()方法,只需创建新对象.这样做的缺点是,它总会产生一个额外的对象,你不需要它.但最终加载方法也将包含该文件.

另一种可能需要额外工作的可能性是创建一个User_Factory库.然后,您可以只在文件底部添加对象,并从工厂创建它的新实例.

我自己是工厂模式的忠实粉丝,但这是你必须自己做出的决定.

我希望这对你有帮助,如果你有任何与实施有关的问题,请告诉我/我们.

  • 你能把这种方法的例子链接到我吗? (2认同)