【问题标题】:PHP Object inheritance and method overridingPHP 对象继承和方法覆盖
【发布时间】:2012-05-23 00:01:53
【问题描述】:

我一直在 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-&gt;table,我会得到我想要的“Language_model”。但是由于表名无效(“MY_Model”无效),父运行“$this-&gt;db-&gt;field_data($this-&gt;table)”的代码错误。由于错误,该代码甚至从未在孩子中执行 var_dump 。为什么“$this-&gt;db-&gt;field_data($this-&gt;table)”也不使用“Language_model”作为$this-&gt;table? 的值 运行 PHP 5.3.9

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

【问题讨论】:

    标签: php oop codeigniter inheritance methods


    【解决方案1】:

    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->fields = ... 之前放置一个 var_dump(table)

    【讨论】:

      猜你喜欢
      • 2019-04-27
      • 2011-06-14
      • 1970-01-01
      • 1970-01-01
      • 2015-09-19
      • 2012-11-20
      • 2013-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多