Пространство имен в PHP CodeIgniter Framework - программирование
Подтвердить что ты не робот

Пространство имен в PHP CodeIgniter Framework

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

4b9b3361

Ответ 1

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

Ответ 2

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

});

Пример Namespaced Class:

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

}

Ответ 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