在CodeIgniter中跨不同文件重用函数的正确方法是什么?

时间:2012-12-22 08:03:52

标签: php codeigniter

我是CodeIgniter的新手,我有这个功能,我在多个模型中使用。

// Returns TRUE if the array of values supplied
// each correspond to a column in the database table.
// Else returns the value of the bad column.
private function _columns_exist( $columns, $table ) {

    foreach( $columns as $key => $value ) {

        if( !$this->db->field_exists( $key, $table ) ) {

            return $key;

        }

    }

    return TRUE;

}

什么被认为是一次编写函数的正确方法,并从许多不同的文件中重用它?

我是否只想为这一个功能创建一个完整的库?

2 个答案:

答案 0 :(得分:2)

如果您在模型中使用通用功能,则可以首先扩展核心模型,并获取所有其他模型以扩展它。阅读有关扩展核心类的更多信息:http://ellislab.com/codeigniter/user-guide/general/core_classes.html

class MY_Model extends CI_Model {

  public function __construct()
  {
      parent::__construct();
  }

  public function common_func()
  {
    // content
  }
}

然后您可以在所有其他模型中使用此功能

class Some_model extends My_Model {

  public function __construct()
  {
      parent::__construct();
  }

  public function some_func()
  {
    // use the common function here
    $result = $this->common_func();
  }
}

答案 1 :(得分:2)

CodeIgniter的观点是基本上有两种类型的自定义函数。作为图书馆方法生活在图书馆中的人和作为简单函数生活在帮助者中的人。

它们之间的区别是最小的,你可以决定把它们放在哪里,但最好的做法是辅助函数大多是独立的,库方法是那些使用CI库,如数据库,会话,你的其他模型。

对于你的函数,最好创建一个库并保存它,但是你也可以帮助你,因为你没有过度使用任何数据库查询。如果是我,我会帮帮忙:

在名为helpers的{​​{1}}目录中创建一个文件,并在db_helper.php文件中的辅助数组中添加一个元素db。请注意,您无需编写全名autoload.php,只需db_helper

将此代码放入您创建的db文件中:

db_helper.php

现在您可以在任何地方使用此功能 - 在您的控制器,模型,甚至视图文件中,就像它是一个简单的功能一样:

<?php
if(!function_exists('_columns_exist')) {
    function _columns_exist( $columns, $table ) {
        $CI =& get_instance();
        foreach( $columns as $key => $value ) {
            if( !$CI->db->field_exists( $key, $table ) ) {
                return $key;
            }
        }
        return TRUE;
    }
}

请注意,在助手或库中不使用_columns_exist($columns, $table) ,必须首先获取CodeIgniter单例对象的实例,然后对其进行操作。您可以在用户指南或StackOverflow上找到更多相关信息。

另请参阅我对 darkdad 的回答的评论,这是我想要的另一个好方法。