无法扩展我的控制器

时间:2012-03-27 22:17:32

标签: php codeigniter controller extend

我正在尝试为我的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);
    }

我知道这是一个非常简单的问题。我一直在尝试关注this指南,但有些事情没有点击......

有人可以帮忙吗?如何从测试中调用函数echoMe()

我知道如何写一个全新的类并调用它,但我正在努力学习如何正确扩展并继续失败。

我打算从某个地方的Controller内拨打“测试”吗?

5 个答案:

答案 0 :(得分:3)

在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_';

确保您将控制器放在正确的文件夹中(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 :(得分:1)

试试这个(一般的想法,而不仅仅是CodeIgniter):

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

请记住,test扩展了您的Controller类,而不是相反 - 因此您无法在test类/对象实例之外调用您的方法。

此外,升级到新版本的CodeIgniter可能是一个好主意 - 但要注意新的父控制器名称。

修改

好的,这应该是为了让你开始 - 注意它是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();

答案 2 :(得分:1)

echoMe()函数在test类中定义,而不在Controller类中定义。当使用controller_client1类的实例调用Controller函数时,echoMe不存在,因为它未在Controller类中定义。

实现此目的的最佳方法是在基础echoMe类中创建空Controller函数。这种方式多态性有效。从controller_client1类的实例调用test函数时,将执行该类的方法。否则,将执行基类中的方法。

我希望我没有错过问题的重点:)

答案 3 :(得分:1)

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');
    }
}

答案 4 :(得分:0)

我认为Kosta实际上已经回答了这个问题,但可能会有一些误解在你身边。所以让我通过一些示例代码扩展它:

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();

“extends”并不意味着实际的Controller类得到了扩展。新类“test”只是继承了Controller类中未声明为“private”的每个方法和属性。 Controller类本身保持不变。