【问题标题】:PHP Codeigniter - parent::__constructPHP Codeigniter - 父级::__construct
【发布时间】:2013-07-22 11:35:45
【问题描述】:

当从 PHP 中的父类继承时,尤其是在 Codeigniter 中,parent::__construct or parent::model() 做了什么?

如果我不__construct 父类会有什么不同? 以及,建议采用哪种方式?

-已添加-

重点更多地放在 Codeigniter 上,即根据版本以不同方式调用 parent::__construct,如果 Codeigniter 会自动执行此操作,是否可以省略它。

【问题讨论】:

  • 了解constructors
  • parent::__construct() 子类构造函数Doc
  • @SeongLee:Niloy 的意思是,在 PHP 中,如果子构造函数有构造函数,则不会调用父构造函数,除非您使用 parent::__construct(); 显式调用它。换句话说:子 masks 父构造方法,所以你需要明确指定parent:: 范围。所以你的问题的答案是:“这取决于父构造函数做什么,如果你需要它”
  • 特别是在 CodeIgniter 中,如果您在应用程序控制器初始化时不调用 parent::__construct();,您将失去 Loader and Core 类并且 $this->load 将永远无法工作。检查system/core/Controller.phplines: 37-54
  • @SeongLee 仅当您想在控制器中声明 __construct() 方法时才需要使用 parent::__construct();,它将覆盖父级的方法。对于模型也是如此,但是在模型中使用 parent::__construct(); 只会记录一条调试消息 "Model Class Initialized",因此如果您需要知道模型何时初始化(在日志中),请继续使用它,如果不,忽略它。

标签: php codeigniter


【解决方案1】:

它会简单地执行父类的构造函数

【讨论】:

    【解决方案2】:

    这是一个普通的类构造函数。我们看下面的例子:

    class A {
        protected $some_var;
    
        function __construct() {
            $this->some_var = 'value added in class A';
        }
    
        function echo_some_var() {
            echo $this->some_var;
        }
    }
    
    class B extends A {
        function __construct() {
            $this->some_var = 'value added in class B';
        }
    }
    
    $a = new A;
    $a->echo_some_var(); // will print out 'value added in class A'
    $b = new B;
    $b->echo_some_var(); // will print out 'value added in class B'
    

    如你所见,B 类继承了 A 的所有值和函数。所以类成员 $some_var 可以从 A 和 B 访问。因为我们在 B 类中添加了一个构造函数,即 A 类的构造函数在创建 B 类的新对象时不会使用。

    现在看下面的例子:

    class C extends A {
        // empty
    }
    $c = new C;
    $c->echo_some_var(); // will print out 'value added in class A'
    

    如你所见,因为我们没有声明构造函数,所以隐式使用了A类的构造函数。但是我们也可以这样做,相当于C类:

    class D extends A {
        function __construct() {
            parent::__construct();
        }
    }
    $d = new D;
    $d->echo_some_var(); // will print out 'value added in class A'
    

    因此,当您希望子类中的构造函数执行某些操作并执行父构造函数时,您只需使用parent::__construct(); 行。给出的例子:

    class E extends A {
        private $some_other_var;
    
        function __construct() {
            // first do something important
            $this->some_other_var = 'some other value';
    
            // then execute the parent constructor anyway
            parent::__construct();
        }
    }
    

    更多信息可以在这里找到:http://php.net/manual/en/language.oop5.php

    【讨论】:

    • @webber .. 很抱歉拒绝您的编辑。确实是对的,所以我推过去了。很好地抓住了private 错误
    【解决方案3】:

    parent::__construct 或 parent::model() 做什么?

    这些函数做的完全一样,只是之前的构造函数被命名为 PHP5 之前的类本身。我在你的例子中说你正在扩展 Model 类(并且在一些旧版本的 CI 上,因为你不需要使用 CI_model),如果我在这个 __construct 中是正确的,它与 model() 相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-22
      • 2011-10-08
      • 1970-01-01
      • 1970-01-01
      • 2011-03-29
      • 2013-02-16
      • 1970-01-01
      相关资源
      最近更新 更多