【问题标题】:Codeigniter Custom Libraries and NamespacesCodeigniter 自定义库和命名空间
【发布时间】:2014-03-14 16:28:21
【问题描述】:

我一直在为已移植到 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');
    }
}
?>

application/libraries/foo/class2.php

<?

namespace foo

class class2{

    function bar(){

    }

} 

?>

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

不存在的类:class2

感谢您的帮助。

【问题讨论】:

标签: php codeigniter namespaces


【解决方案1】:

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

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

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

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

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

此线程中有更多信息:Namespace in PHP CodeIgniter Framework

【讨论】:

  • 这是不正确的。那行代码与CI中加载的内容无关,那行代码是为了防止用户不经过CI框架直接加载该文件。
  • 嗯,我实际上遇到了一个问题,就像大卫说的那样。命名空间必须是第一行代码。但是 codeigniter 希望定义的基本路径成为第一行代码。所以它是一个或另一个,但在任何一种情况下都会出错。
【解决方案2】:

Codeigniter 不支持 2.x 和 3.x 中的命名空间,我通常会手动加载它们,尤其是使用 3rd 方库。使用您的示例,我会这样做:

// you can still manually load in libraries like this
require_once(APPPATH.'libraries/foo/class2.php');

class class1 {

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

        // instantiate the class2 and make it available for all of class1 methods
        $this->class2 = new foo/class2();
    }

}

仅仅因为它是一个框架并不能阻止您使用核心 php 功能,大多数人忘记了您仍然可以使用普通的 php 方法来获得相同的结果。

【讨论】:

【解决方案3】:

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

为了解决这个问题(不修改源文件),我制作了一个“引导”类来加载和扩展核心库:

<?php

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

class class2 extends foo\class2 {}

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

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

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

【讨论】:

    【解决方案4】:

    据我所知,问题是“加载”没有考虑命名空间。

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

    您通常包含文件,当您创建一个新对象时,您使用“foo/bar”。

    如果加载类支持这一点,我不是,您可能需要简单地手动创建一个新对象(无论如何这都是加载类所做的,它包含文件并创建一个新对象)。

    【讨论】:

      【解决方案5】:

      我会引用Alex的答案。


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

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

      我们也将src/randomorg/or src/foo 中的所有文件移动到third_party 中名为RandomOrgfoo 的文件夹中,例如application/third_party/RandomOrgapplication/third_party/foo。您的文件夹应如下所示:https://github.com/defiant/randomorg/tree/master/src/randomorg

      用法:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-21
        • 1970-01-01
        相关资源
        最近更新 更多