PHP CodeIgniter Framework 中的 Namespace如何使命名空间在 Codeigniter 中工作

2022-08-30 21:30:50

CodeIgniter 是否支持 Namespace?


答案 1

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

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

将其添加到应用程序/配置/配置的末尾.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();

}

答案 2

命名空间由php支持,而不是由框架支持(在你的例子中是codeigniter)。如果你使用命名空间,php 版本必须>= 5.3.0 Codeigniter dosen 不要使用命名空间,因为它是为支持 php 4 而编写的。


推荐