我正在尝试为我的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
内拨打“测试”吗?
答案 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类本身保持不变。