Создать простую библиотеку Codeigniter - PullRequest
5 голосов
/ 07 декабря 2011

Для моего текущего проекта я решил создать библиотеку для некоторых общих функций.

Пример: Login_check, get_current_user и т. Д.

С моим небольшим знанием я создал простой, но, к сожалению, егоработает.

Здесь моя библиотека:

FileName: Pro.php и находится в application/libraries

class Pro{

    public function __construct()
    {

       parent::_construct();
        $CI =& get_instance();
       $CI->load->helper('url');
       $CI->load->library('session');
       $CI->load->database();
    }

    function show_hello_world()
    {
        $text = "Hello World";
        return $text;
    }
}

?> 

И я попытался загрузить его на свой контроллер:

<?php
class Admin extends CI_Controller
{
    function __construct()
    {     
        parent::__construct();
        $this->load->database();
        $this->load->library(array('session'));
        $this->load->library("Pro");
    }
    function index()
    {
        echo($this->Pro->show_hello_world());
    }
}

?>

Я не вижу там никаких ошибок ... но я получаю пустую страницу.

Что со мной не так?

Спасибо.

Редактировать:Я получил эту ошибку:

Call to a member function show_hello_world() on a non-object in C:\wamp\www\Project\application\controllers\admin.php on line 13

Ответы [ 4 ]

15 голосов
/ 07 декабря 2011

Я заметил одну вещь: удалите parent::__construct() из конструктора вашей библиотеки, потому что он ничего не расширяет, поэтому не имеет родителя для вызова.

Кроме того, включите создание отчетов об ошибках, установив для среды "development" вindex.php, и вы также можете увеличить порог регистрации до 4 в config / config.php, чтобы регистрировать ошибки.

Попробуйте этот простой тестовый пример:

файл Pro.phpв приложении / библиотеках:

class Pro {

  function show_hello_world()
  {
    return 'Hello World';
  }
}

Контроллер admin.php в приложении / контроллерах

class Admin extends CI_Controller
{
    function index()
    {
        $this->load->library('pro');
        echo $this->pro->show_hello_world();
    }
}
2 голосов
/ 07 декабря 2011

в то время как имя вашего класса пишется с большой буквы, все ваши ссылки на библиотеку при загрузке и использовании должны быть в нижнем регистре. вам также не нужен конструктор, как упоминал другой комментатор.

так вместо:

echo($this->Pro->show_hello_world());

вы должны иметь:

echo($this->pro->show_hello_world());
1 голос
/ 27 июня 2014

Я предпочитаю стандартный подход php автозагрузчика, так как вам вообще не нужно менять свои классы, вы можете использовать ваши стандартные классы без изменений

скажем, например, ваш класс является классом 'Custom_Example_Example2' и хранится в библиотеках в подпапках вы можете добавить этот автозагрузчик в мастер index.php

убедитесь, что он добавлен ниже определенной константы APPPATH

//autoload custom classes
function __autoload($className) {
if (strlen(strstr($className, 'Custom_')) > 0 ||
   strlen(strstr($className, 'Other1_')) > 0 ||
   strlen(strstr($className, 'Other2_')) > 0) {

    $exp  = explode('_', $className);
    $file = APPPATH.'libraries';

    if(!empty($exp)) {
        foreach($exp as $segment) {
            $file .= '/'.strtolower($segment);
        }
    }
    $file .= '.php';
    require_once $file;

    //debug
    //echo $file.'<br />';
}
}

Это будет искать вызовы классов, соответствующие префиксу 'Custom_' и перенаправить их в относительное местоположение в этом случае

вам нужно только определить базовый префикс, а не подпапки / классы они будут автоматически обнаружены этим кодом

APPPATH.'libraries/custom/example/example2.php'

Вы можете назвать его в контроллере стандартным способом php

$class = new Custom_Example_Example2;

или

$class = new custom_example_example2();

Вы можете изменить скрипт по своему вкусу, в настоящее время он ожидает, что все папки и имена файлов в библиотеке будут строчными, но вы можете удалить функцию strtolower (), чтобы разрешить использование нескольких регистров.

Вы можете изменить требование один раз, чтобы повторить, чтобы проверить вывод, раскомментировав эту строку и обновив страницу, убедитесь, что у вас есть класс init / test в контроллере или модели для запуска теста

echo $file.'<br />';

Спасибо Daniel

0 голосов
/ 13 июня 2018

В Pro.php

class Pro{
    protected $CI;
    public function __construct() {
        $this->CI = & get_instance();
    }

    public function showHelloWorld(){
        return "Hello World";
    }
}

В вашем контроллере

class Staff extends CI_Controller {

    public function __construct() {
        parent::__construct();
        $this->load->database();

        $this->load->helper(array('url_helper', 'url'));
        $this->load->library("pro");

    }

    public function index() {
        echo $this->pro->showHelloWorld();die;

    }
}

Просто сделайте эти вещи, чтобы получить доступ к своей пользовательской библиотеке в codeignitor.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...