创建简单的Codeigniter库

时间:2011-12-07 10:36:33

标签: php class codeigniter

对于我目前的项目,我决定为一些常用功能创建一个库。

Ex:Login_check,get_current_user等。

凭借我的小知识,我创造了一个简单的但不幸的是它无法正常工作。

我的图书馆:

FileName:Pro.php位于application/libraries     

class Pro{

    public function __construct()
    {

       parent::_construct();
        $CI =& get_instance();
       $CI->load->helper('url');
       $CI->load->library('session');
       $CI->load->database();
    }

    function show_hello_world()
    {
        $text = "Hello World";
        return $text;
    }
}

?> 

我试图将它加载到我的控制器上:

<?php
class Admin extends CI_Controller
{
    function __construct()
    {     
        parent::__construct();
        $this->load->database();
        $this->load->library(array('session'));
        $this->load->library("Pro");
    }
    function index()
    {
        echo($this->Pro->show_hello_world());
    }
}

?>

我看不到任何错误......但我得到一个空白页。

我怎么了?

谢谢。

编辑:我收到了这个错误:

Call to a member function show_hello_world() on a non-object in C:\wamp\www\Project\application\controllers\admin.php on line 13

4 个答案:

答案 0 :(得分:15)

我注意到一件事:从库构造函数中删除parent::__construct(),因为它没有扩展任何东西,因此没有父级可以调用。

此外,通过在index.php中将环境设置为“development”来启用错误报告,您可能还希望在config / config.php中将日志记录阈值提高到4,以便记录错误。

试试这个简单的测试用例:

应用程序/库中的Pro.php文件:

class Pro {

  function show_hello_world()
  {
    return 'Hello World';
  }
}

应用程序/控制器中的控制器admin.php

class Admin extends CI_Controller
{
    function index()
    {
        $this->load->library('pro');
        echo $this->pro->show_hello_world();
    }
}

答案 1 :(得分:2)

虽然您的类名大写,但在加载和使用库时对库的所有引用都应该是小写的。你也不需要像其他评论者那样提到构造函数。

所以代替:

echo($this->Pro->show_hello_world());

你应该:

echo($this->pro->show_hello_world());

答案 2 :(得分:1)

我更喜欢标准的php自动加载器方法,这样你根本不需要改变你的类,你可以使用你的标准类而无需修改

比如说你的班级是班级&#39; Custom_Example_Example2&#39;并存储在库中 在子文件夹中,您可以在主索引中添加此自动加载器.php

确保将其添加到定义的APPPATH常量

之下
//autoload custom classes
function __autoload($className) {
if (strlen(strstr($className, 'Custom_')) > 0 ||
   strlen(strstr($className, 'Other1_')) > 0 ||
   strlen(strstr($className, 'Other2_')) > 0) {

    $exp  = explode('_', $className);
    $file = APPPATH.'libraries';

    if(!empty($exp)) {
        foreach($exp as $segment) {
            $file .= '/'.strtolower($segment);
        }
    }
    $file .= '.php';
    require_once $file;

    //debug
    //echo $file.'<br />';
}
}

这将查找匹配&#39;自定义_&#39;字首 并在这种情况下将它们重新路由到相对位置

您只需要定义基本前缀而不是子文件夹/类 这些代码将自动检测到

APPPATH.'libraries/custom/example/example2.php'

您可以在控制器中以标准的php方式调用它

$class = new Custom_Example_Example2;

$class = new custom_example_example2();

您可以根据自己的喜好修改脚本,目前它希望库中的所有文件夹和文件名都是小写的,但您可以删除strtolower()函数以允许多个套管。

您可以通过取消注释此行并刷新页面来更改一次要回显来测试输出,确保在控制器或模型中有一个init / test类来运行测试

echo $file.'<br />';

由于 丹尼尔

答案 3 :(得分:0)

在Pro.php中

class Pro{
    protected $CI;
    public function __construct() {
        $this->CI = & get_instance();
    }

    public function showHelloWorld(){
        return "Hello World";
    }
}

在您的控制器中

class Staff extends CI_Controller {

    public function __construct() {
        parent::__construct();
        $this->load->database();

        $this->load->helper(array('url_helper', 'url'));
        $this->load->library("pro");

    }

    public function index() {
        echo $this->pro->showHelloWorld();die;

    }
}

只需执行以下操作即可访问codeignitor中的自定义库。