Не удается расширить мой контроллер - PullRequest
1 голос
/ 28 марта 2012

Я пытаюсь написать расширение для моего Controller класса. Проблема в том, что я не могу понять, как ..

У меня есть следующий класс с именем test, в котором есть одна функция, которая просто возвращает aaaa и находится в том же файле, в конце, что и мой Controller:

class test extends Controller
    {
        function test()
            {
                parent::Controller();
            }

        function echoMe(){

            return 'aaaaaaaaaaaaaaaaa';
        }
    }

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

Вызов неопределенного метода Controller :: echoMe ()

Вот клиентская функция (вызов echoMe() находится прямо вверху):

function controller_client1($controlData = NULL)
    {
        echo $this -> echoMe();

        //as the client page is content from the xml, mmodel needs the page number
        $pageNumber = '';
        if(isset($_GET['number']))
            {
                $num = htmlentities($_GET['number']);
                if(ctype_digit($num) && $num >= 0)
                    {
                        $pageNumber = $num;
                    }
            }
        else{
            $pageNumber = 0;
        }
        //loading the page content
        $data = $this->model->model_loadXMLdata($pageNumber);


        if(!empty($controlData))
            {
                //check if there is any info in the control data sent
                foreach($controlData as $key => $value)
                    {
                        //add the info to the data array
                        $data[$key] = $value;
                    }
            }

        $this->load->load_clientHomePage($data);
    }

Я знаю, что это очень простой вопрос. Я пытался следовать этому руководству, но что-то не щелкает ...

Может кто-нибудь помочь, пожалуйста? Как я могу вызвать функцию echoMe() из теста?

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

Должен ли я назвать "тест" изнутри Controller где-нибудь?

Ответы [ 5 ]

3 голосов
/ 28 марта 2012

В config.php вы устанавливаете префикс для файла, который вы хотите расширить. Так что это должен быть My_test, если только вы не изменили этот пресет (отображается ниже)

/*
|--------------------------------------------------------------------------
| Class Extension Prefix
|--------------------------------------------------------------------------
|
| This item allows you to set the filename/classname prefix when extending
| native libraries.  For more information please see the user guide:
|
| http://codeigniter.com/user_guide/general/core_classes.html
| http://codeigniter.com/user_guide/general/creating_libraries.html
|
*/
$config['subclass_prefix'] = 'MY_';

Убедитесь, что у вас есть контроллер в правильной папке (application / core в codeigniter 2.1.0), тогда у вас не должно быть проблем. Надеюсь, это поможет

вот мой контроллер, который я расширяю. Файл называется My_Controller.php (креатив, я знаю)

<?php
class MY_Controller extends CI_Controller {

function __construct()
{
    parent::__construct();
//constructor code here
}

//Custom functions here
}

//sencond controller I extend in the same file
class MY_Admin extends CI_Controller {

function __construct()
{
//more custom stuff for admin stuff
}

//more custom functions for admin stuff
}

?>

Видите ли, у меня есть два расширенных контроллера в одном файле. Мой расширяющий код выглядит так:

<?php
class home extends MY_Controller
{

, а затем просто замените My_Controller на My_Admin, если я хочу расширить админ.

1 голос
/ 28 марта 2012

echo $this -> echoMe(); не удастся, потому что он создан в дочернем (расширенном) классе, а вы вызываете его в родительском классе. Вопрос немного сложен для понимания.

abstract class Controller{
    public function __construct(){

    }

    public function echoMe($str){
        echo $str;
    }

}

class test extends Controller{
    public function __construct(){
       parent::echoMe('aaaaaaaaaa');
    }
}
1 голос
/ 28 марта 2012
Функция

echoMe() определена в классе test, а не в классе Controller.Когда функция controller_client1 вызывается с экземпляром класса Controller, echoMe не существует, поскольку она не определена в классе Controller.

Лучший способ добиться этого - создать пустую функцию echoMe в базовом Controller классе.Так работает полиморфизм.При вызове функции controller_client1 из экземпляра класса test будет выполнен метод из этого класса.В противном случае будет выполнен метод из базового класса.

Надеюсь, я не упустил суть вопроса:)

1 голос
/ 28 марта 2012

Попробуйте это (общая идея, а не только CodeIgniter):

$test = new test();
echo $test->echoMe();

Помните, test расширяет ваш класс Controller, а не наоборот - поэтому вы не можете вызывать ваши методы снаружиtest экземпляр класса / объекта.

Кроме того, было бы неплохо обновить его до новой версии CodeIgniter, хотя остерегайтесь имени нового родительского контроллера.

EDIT

Ладно, с этого надо начать - обратите внимание, что это PHP5, а не PHP4, поэтому конструкторы называются __construct, а не именем класса:

class Controller {
    public $mainvar; 

    function __construct() {
        $this->mainvar = '<br />';
    }

    function echoMe() {
        return 'aaaaaaaaaaaaaaaaa';
    }
}

class Test extends Controller {
    function __construct() {
        parent::__construct();
    }

    function echoMeAgain(){
        return 'bbb';
    }
}

$test = new Test();

echo $test->echoMe();
echo $test->mainvar;
echo $test->echoMeAgain();
0 голосов
/ 28 марта 2012

Я думаю, что Коста уже ответил на этот вопрос, но на вашей стороне может быть какое-то недопонимание. Итак, позвольте мне расширить это на некоторый пример кода:

class Controller {
    public function run() {
        $this->echoMe();
    }
}

class test extends Controller {
    public function echoMe() {
        echo "works";
    }
}

// This does NOT work, because Controller::echoMe does not exist
$controller = new Controller();
$controller->run();

// This DOES work, because $this will be instance of test, and
// test::echoMe exists and is callable.
$test = new Test();
$test->run();

«расширяет» не означает, что фактический класс Controller расширяется. Новый класс «test» просто наследует каждый отдельный метод и свойство, которое не объявлено как «private», от класса Controller. Сам класс Controller остается нетронутым.

...