Пространство имен в PHP CodeIgniter Framework
Поддерживает ли CodeIgniter пространство имен?
5 ответов
Пространство имен поддерживается php, а не фреймворком (codeigniter в вашем случае). Если вы используете пространства имен, версия php должна быть>= 5.3.0. Codeigniter не использует пространства имен, потому что он написан для поддержки php 4.
Как заставить пространства имен работать в 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();
}
Просто выполните простую автозагрузку psr-4, и все готово.
в config/config.php
загрузить композитор с помощью
$config['composer_autoload'] = FCPATH.'vendor/autoload.php';
В корневом каталоге запустите composer install
В сформированном composer.json
добавьте следующие строки для автозагрузки psr4.
"autoload": {
"psr-4": {
"App\\": "application/"
}
},
App
в этом случае будет вашим пространством имен.
Пример: предположим, у вас есть класс Service
в папке библиотек. Вы можете разместить его с помощью:
<?php
namespace App\libraries;
class Service{
}
Используйте это в Welcome
класс контроллера:
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
use App\libraries\Service;
class Welcome extends CI_Controller {
}
Вы можете проверить это: https://github.com/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) {}
}
добавьте строку ниже в класс, который вы хотите использовать goutte`
require __DIR__ . "/../../../vendor/autoload.php";
и в абсолютном пути к вашему проекту запустите :`composer
require fabpot/goutte
чтобы добавить лезвие в ваш файл package.json. теперь все должно работать хорошо.