Пространство имен в 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) {}
}

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

добавьте строку ниже в класс, который вы хотите использовать goutte`

      require __DIR__ . "/../../../vendor/autoload.php";

и в абсолютном пути к вашему проекту запустите :`composer

      require fabpot/goutte

чтобы добавить лезвие в ваш файл package.json. теперь все должно работать хорошо.

Другие вопросы по тегам