2010-09-13 33 views
12

¿CodeIgniter admite Namespace?Espacio de nombres en PHP CodeIgniter Framework

+1

Una mejor pregunta es ¿por qué las necesita? En general, código de "espacio de nombres" con prefijos o sufijos. Por ejemplo, $ this-> user_lib o $ this-> user_m significa que no chocarás con nada más. REALMENTE me gustaría que CI admita Controller_Foo, pero eso no sucederá pronto: -/ –

Respuesta

15

Los espacios de nombres son compatibles con php y no con el framework (codeigniter en su caso). Si utiliza espacios de nombres versión PHP debe ser> = 5.3.0 CodeIgniter espacios de nombres de uso dosen`t porque está escrito para apoyar PHP 4.

+0

Aquí hay una solución alternativa encontrada: http://porquero.blogspot.com/2012/03/codeigniter-hmvc-namespaces-part-1.html –

22

Cómo conseguir espacios de nombres para trabajar en CodeIgniter

realidad , puede hacer que los espacios de nombres funcionen junto con las rutas relativas en sus modelos de aplicaciones. Esta modificación hace que los modelos de carga mucho más fácil y también le permite tener las interfaces ...

Añadir esto al final de su application/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'); 
    } 

}); 

Ejemplo namespaced Clase:

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

} 

Ejemplo de instancias de clase en su código en algún lugar:

NOTA IMPORTANTE: NO USE CONSTRUIDO EN CI_Loader (Ej: $ this-> load-> model();)

// This will Autoload Your Namespaced Class 
$example = new foo\Bar(); 

o, alternativamente, en la parte superior de su clase PHP (por ejemplo: controlador, otro modelo), se puede hacer esto ...

<?php 
... 
use foo\Bar as FooBar; 

... 

// Then you can just do this 
$example = new FooBar(); 

Ejemplo de interfaz:

<?php 
// File: application/interfaces/awesome_interface.php 
interface Awesome_interface { 

    public function getFoobar(); 

} 
+0

después de un par de cambios en las clases de métodos 'spl_autoload_register' cargadas sin error. Thx –

+0

De nada. –

+0

@TimothyPerez ¿Hay alguna otra manera de cargar bibliotecas que tengan espacio de nombre en CodeIgniter 3? – sam

0

Puede consultar esto: yidas/codeigniter-psr4-autoload

Th e define lib app como raíz de la aplicación CI de manera que cada clases de aplicación podrían ser cargados con PSR-4 espacio de nombres:

\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 {} 

Código de ejemplo para la definición de una clase:

<?php 
namespace app\helpers; 
class ArrayHelper 
{ 
    public static function indexBy($input) {} 
} 

https://github.com/yidas/codeigniter-psr4-autoload

Cuestiones relacionadas