Поддерживает ли CodeIgniter пространство имен?
Пространство имен в PHP CodeIgniter Framework
Ответ 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) {}
}