【问题标题】:Namespace in PHP CodeIgniter FrameworkPHP CodeIgniter 框架中的命名空间
【发布时间】:2011-04-11 16:00:00
【问题描述】:

CodeIgniter 是否支持命名空间?

【问题讨论】:

  • 一个更好的问题是你为什么需要它们?我通常带有前缀或后缀的“命名空间”代码。例如,$this->user_lib 或 $this->user_m 意味着你不会与其他任何东西发生冲突。我真的很希望 CI 支持 Controller_Foo 但这不会很快发生:-/

标签: php codeigniter namespaces


【解决方案1】:

如何让命名空间在 Codeigniter 中工作

实际上,您可以让命名空间与应用程序模型中的相对路径一起工作。这种修改使加载模型变得更加容易,并且还允许您拥有接口......

将此添加到 application/config/config.php 的末尾

spl_autoload_extensions('.php'); // Only Autoload PHP Files

spl_autoload_register(function($classname) {
    if (strpos($classname,'\\') !== false) {
        // Namespaced Classes
        $classfile = strtolower(str_replace('\\', '/', $classname));

        if ($classname[0] !== '/') {
            $classfile = APPPATH.'models/' . $classfile . '.php';
        }               
        require($classfile);
    } elseif (strpos($classname, 'interface') !== false) {
        // Interfaces
        strtolower($classname);
        require('application/interfaces/' . $classname . '.php');
    }
});

示例命名空间类:

<?php
// File: application/models/foo/bar.php
namespace foo;

class Bar extends \CI_Model implements \Awesome_interface {

    public $foobar;

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

    public function getFoobar() {
        return $this->foobar;
    }

    public function setFoobar($val) {
        $this->foobar = $val;
    }

}

代码中某处的类实例化示例:

重要提示:请勿在 CI_Loader 中使用内置功能(例如:$this->load->model();)

// This will Autoload Your Namespaced Class
$example = new foo\Bar();

或者在您的 PHP 类(例如:控制器、其他模型)之上,您可以这样做...

<?php
...
use foo\Bar as FooBar;

...

// Then you can just do this
$example = new FooBar();

界面示例:

<?php
// File: application/interfaces/awesome_interface.php
interface Awesome_interface {

    public function getFoobar();

}

【讨论】:

  • 在对spl_autoload_register 方法类进行几次更改后,加载时不会出现错误。谢谢
  • @TimothyPerez 有没有其他方法可以在 CodeIgniter 3 中加载具有命名空间的库?
  • @JunaidQadirShekhanzai 经过几次更改 ?你做了什么改变?
  • 已经好几年了,我不记得了。对不起
  • 3.x 支持命名空间。我已经搬到 Laravel
【解决方案2】:

只需简单的 psr-4 自动加载即可完成。

在config/config.php加载作曲家使用

$config['composer_autoload'] = FCPATH.'vendor/autoload.php';

在根目录下运行composer install 在生成的composer.json 中添加以下行用于 psr4 自动加载。

    "autoload": {
        "psr-4": {
            "App\\": "application/"
        }
    },  

App 在这种情况下将是您的命名空间。

示例:假设您在库文件夹中有一个类Service。您可以使用以下命名空间:

<?php
namespace App\libraries;

class Service{
}

在Welcome控制器类中使用它:

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

use App\libraries\Service;
class Welcome extends CI_Controller {
}

【讨论】:

    【解决方案3】:

    你可以看看这个:yidas/codeigniter-psr4-autoload

    lib 将app 定义为 CI 应用程序根,以便应用程序中的每个类都可以使用 PSR-4 命名空间加载:

    \app\libraries\MemberService::auth();
    \app\helpers\ArrayHelper::indexBy($input);
    \app\widgets\StatWidget::run();
    class Blog_model extends app\core\BaseModel {}
    class Car_model implements app\contracts\CarInterface {}
    

    定义类的示例代码:

    <?php
    namespace app\helpers;
    class ArrayHelper
    {
        public static function indexBy($input) {}
    }
    

    https://github.com/yidas/codeigniter-psr4-autoload

    【讨论】:

      【解决方案4】:

      名称空间由 php 支持,而不是由框架(在您的情况下为 codeigniter)支持。如果你使用命名空间 php 版本必须 >= 5.3.0 Codeigniter 不使用命名空间,因为它是为支持 php 4 而编写的。

      【讨论】:

      猜你喜欢
      • 2011-03-09
      • 1970-01-01
      • 1970-01-01
      • 2013-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多