Codeigniter自定义库和命名空间

时间:2014-03-14 16:28:22

标签: php codeigniter namespaces

我一直在为一个项目创建自定义库,我已经将其移植到CI框架中,并且遇到了某些类具有相同名称的问题。

为了避免这个问题,我尝试实现命名空间无济于事。我一直在做研究,我知道在过去这可能是不可能的,但是对于新版本的PHP,我想知道是否有办法做到这一点,或者我是否正确地做到了。

CI版本:2.1.4 PHP版本:5.4.12

以下是我的设置演示:

应用/库/ class1.php

<?

class class1{
   public function __construct()
    {
        $CI =& get_instance();

        $CI->load->library('foo/class2.php');
    }
}
?>

应用/库/富/ class2.php

<?

namespace foo

class class2{

    function bar(){

    }

} 

?>

当我运行CI应用程序时,我将收到以下错误:

不存在的课程:class2

感谢您的帮助。

4 个答案:

答案 0 :(得分:2)

从我发现的,如果库文件没有

if ( ! defined('BASEPATH')) exit('No direct script access allowed');

作为第一行代码,它不会加载库。

但是名称空间声明需要高于它。

CodeIgniter是为PHP4编写的,而命名空间是PHP5。

此主题中有更多信息:Namespace in PHP CodeIgniter Framework

答案 1 :(得分:2)

在尝试使用某些第三方库时,此问题出现在个人项目中。

为了解决它(不修改源文件),我创建了一个“bootstrap”类来加载和扩展核心库:

<?php

require_once(APPPATH.'libraries/foo/class2.php');

class class2 extends foo\class2 {}

然后可以加载和使用这个“bootstrap”类,就像它是扩展的类一样:

$this->load->library("class2");

$this->class2->bar(); // same as foo\class2->bar();

答案 2 :(得分:0)

问题在于,就我所知,'load'没有考虑名称空间。

这意味着load('foo / class2')将在libraries文件夹中查找文件夹'foo'。

你包含文件正常,当你创建一个新对象时,你使用'foo / bar'。

我不是如果load类支持那个,你可能只需要手动创建一个新对象(无论如何这是load类所做的,它包含文件并创建一个新对象)。

答案 3 :(得分:0)

我将引用Alex的答案。


我知道我已经回答了这个问题,然后才找不到位置,也不知道要搜索什么。就是这样:Codeigniter只能加载单个 php文件库(不包括完全不同的驱动程序)。要加载这种(命名空间的)库,您必须使用类似https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader-examples.md(类示例)的方法。

让我们将其命名为Autoloader_psr4并将其保存在库中(修改类声明以逐字匹配此名称(例如Autoloader_psr4)。删除类中的名称空间声明,使其看起来像:{{3 }}

让我们还将src/randomorg/ or src/foo中的所有文件移动到third_party中名为RandomOrgfoo的文件夹中,例如application/third_party/RandomOrgapplication/third_party/foo。您的文件夹应该看起来像这里的内容:https://pastebin.com/NU8Rbp7Y

用法:

$this->load->library('autoloader_psr4');
$this->autoloader_psr4->register();
$this->autoloader_psr4->addNamespace('RandomOrg', APPPATH . 'third_party/RandomOrg');
$random = new \RandomOrg\Client(); // or whatever...
相关问题