PHP CodeIgniter框架中的命名空间

zrfyljdw  于 2022-12-07  发布在  PHP
关注(0)|答案(5)|浏览(211)

CodeIgniter是否支持命名空间?

jutyujz0

jutyujz01#

如何在Codeigniter中使用命名空间

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

将其添加到应用程序/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-〉加载-〉模型();)

// 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();

}
nqwrtyyt

nqwrtyyt2#

命名空间是由php支持的,而不是由框架支持的(在你的例子中是codeigniter)。如果你使用命名空间,php版本必须〉= 5.3.0。

kqhtkvqz

kqhtkvqz3#

只需一个简单的psr-4自动加载,你就完成了。
config/config.php中使用

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

在根目录中运行composer install。在生成的composer.json中,添加以下几行以便psr 4自动加载。

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

在本例中,App将是您的名称空间。
例如:假设你在libraries文件夹中有一个类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 {
}
mitkmikd

mitkmikd4#

你可以看看这个:yidas/codeigniter-psr4-autoload
库将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

zu0ti5jz

zu0ti5jz5#

在你想使用goutte的类中添加下面一行

require __DIR__ . "/../../../vendor/autoload.php";

并在项目的绝对路径中运行:'composer

require fabpot/goutte

将goutte添加到package.json文件中。现在一切都应该正常了。

相关问题