2010-09-13 2 views
12

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

+1

Лучше задать вопрос, зачем они вам нужны? Я вообще называю «пространство имен» кодом с префиксами или суффиксами. Например, $ this-> user_lib или $ this-> user_m означает, что вы не столкнетесь ни с чем другим. Я бы ДЕЙСТВИТЕЛЬНО хотел, чтобы CI поддерживал Controller_Foo, но это не скоро произойдет: -/ –

ответ

15

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

+0

Обнаружен обходной путь: http://porquero.blogspot.com/2012/03/codeigniter-hmvc-namespaces-part-1.html –

22

Как получить Namespaces работать в 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 Класс:

<?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; 
    } 

} 

Пример Инстанцирование класса в коде Somewhere:

ВАЖНОЕ ЗАМЕЧАНИЕ: НЕ ИСПОЛЬЗУЙТЕ ПОСТРОИТЬ В 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(); 

} 
+0

после нескольких изменений в классах классов 'spl_autoload_register' загрузки без ошибок. Thx –

+0

Добро пожаловать. –

+0

@TimothyPerez Есть ли другой способ загрузить библиотеки, имеющие пространство имен в CodeIgniter 3? – sam

0

Вы можете проверить это: yidas/codeigniter-psr4-autoload

Th е 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

Смежные вопросы