Пространство имен в PHP CodeIgniter Framework - PullRequest
15 голосов
/ 13 сентября 2010

Поддерживает ли CodeIgniter пространство имен?

Ответы [ 3 ]

29 голосов
/ 18 февраля 2014

Как заставить пространства имен работать в 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);
    } else if( 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();

}
17 голосов
/ 13 сентября 2010

Пространство имен поддерживается php, а не фреймворком (codeigniter в вашем случае).Если вы используете пространства имен, версия php должна быть> = 5.3.0. Codeigniter не использует пространства имен, поскольку он написан для поддержки php 4.

1 голос
/ 16 января 2018

Вы можете проверить это: 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

...