【问题标题】:Create Simple Codeigniter library创建简单的 Codeigniter 库
【发布时间】:2012-01-14 21:11:42
【问题描述】:

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

例如:Login_check、get_current_user 等

根据我的知识,我创建了一个简单的,但不幸的是它不起作用。

这是我的图书馆:

文件名: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

【问题讨论】:

  • @Hary 没有错误,我得到一个空白页。
  • 在第 13 行调用 C:\wamp\www\project\application\controllers\admin.php 中非对象的成员函数 show_hello_world()
  • @Hary echo($this-&gt;Pro-&gt;show_hello_world());
  • @DileepDil 您是否在我的回答中完全尝试了整个测试用例? (我已经更新了一点)
  • @DamienPirsy 是的,我做到了...现在我正在下载 codeigniter [新鲜的]

标签: php class codeigniter


【解决方案1】:

我注意到一件事:从您的库构造函数中删除 parent::__construct(),因为它没有扩展任何内容,因此没有要调用的父对象。

此外,通过在 index.php 中将环境设置为“开发”来启用错误报告,您可能还希望在 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();
    }
}

【讨论】:

  • 谢谢,但现在Undefined property: Admin::$Pro
  • 你需要从库构造函数中移除它,而不是控制器构造函数
  • define('ENVIRONMENT', 'development'); 所以它的正确...log_threshold 设置为 4..
  • #Damien 我从库构造函数中删除了它。
  • 尽量减少示例代码,例如删除不需要的库调用。只需加载您的并查看
【解决方案2】:

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

所以而不是:

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

你应该有:

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

【讨论】:

  • 谢谢你,其实我弄错了,但你回答得很好。
  • @DileepDil 我看到你不要像我告诉你的那样做,因为如果你好好阅读我的答案,而不是仅仅应用一点这个和一点,你就会看到我'我一直在使用与这个答案完全相同的东西。哦,好吧。
  • 非常真实,@DamienPirsy 在我之前得到了这个。我没有看到它,因为他没有明确提到它,但是您可以在他的回答中看到小写。
  • @davidethell 不要误会我,我不想剥夺你接受的答案标记,我不在乎 :),当有人说他时,我会很紧张在做某事的同时仍然按照自己的方式行事;我已经看到很多了。 Dileep,将此作为已接受的答案,下次请注意那些花了 30 分钟试图找出您的代码有什么问题的人。
  • 没问题;您无需将其删除为已接受,我不在乎,不要误会我的意思。如果您接受自动完成,IDE 通常会更改它。无论如何,很高兴你解决了你的问题,干杯
【解决方案3】:

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

比如说,你的班级是“Custom_Example_Example2”类,并且存储在库中 在子文件夹中,您可以在主 index.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 />';
}
}

这将查找与“Custom_”前缀匹配的类调用 并在这种情况下将它们重新路由到相对位置

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

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

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

$class = new Custom_Example_Example2;

$class = new custom_example_example2();

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

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

echo $file.'<br />';

谢谢 丹尼尔

【讨论】:

    【解决方案4】:

    在 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 中访问您的自定义库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多