PHP对象继承和方法覆盖

时间:2012-05-15 13:07:52

标签: php oop codeigniter inheritance methods

我一直在CodeIgniter框架中做一些PHP。我创建了自己的Model类,它扩展并覆盖了默认的codeigniter。以下是:

<?php
class MY_Model extends CI_Model
{
    public $table;
    public function __construct()
    {
        parent::__construct();
        $this->table = get_class($this);
        $this->fields = $this->db->field_data($this->table);
    }
}

然后,我创建了一个模型,用于管理数据库中的语言,代码如下。从Language_model中,如果我回显$this->table,我得到“Language_model”,这就是我想要的。但是运行“$this->db->field_data($this->table)”的父代中的代码错误作为表名无效(“MY_Model”无效)。由于错误,代码甚至从未在子进程中执行var_dump。为什么“$this->db->field_data($this->table)”也不使用“Language_model”作为$this->table?的值 运行PHP 5.3.9

class Language_model extends MY_Model {
    function __construct()
    {
        parent::__construct();
        var_dump($this->fields);
    }
}

1 个答案:

答案 0 :(得分:0)

get_class有一个特殊的行为:

    <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');


class TestBase extends CI_Controller{
    public function nameWthis(){
        return get_class($this);
    }
    public function nameWOthis(){
        return get_class();
    }
}



class Test extends TestBase{
    public function index()
    {
        echo $this->nameWthis();
        echo '<br/>';
        echo $this->nameWOthis();
    }
}

将输出

Test
TestBase

使用不带参数的get_class()会产生静态分辨率,这可能是你的问题。 get_class($ this)应该按照你的指示工作,动态地返回当前的类名。

添加代码以检查'Language_model'是否存在。并且要小心,可能是名称区分大小写并且可能导致失败。

最好有错误代码。检查您的日志。在$ this-&gt; fields = ...

之前放一个var_dump(表格)