2013-02-25 25 views
9

我是CodeIgniter和OOP的初学者。我正在阅读CI教程的一页here。我发现了一些在我脑海中提出问题的东西。
看看这段代码:当控制器类扩展父控制器时,为什么还需要父构造函数?

<?php 
class News extends CI_Controller { 
    public function __construct() 
    { 
     parent::__construct(); 
     $this->load->model('news_model'); 
    } 

我认为,如果我们做了一个扩展是CI_Controller一类,我们假设它必须有它的父类中的所有方法和属性(虽然我们可以忽略它们)。那么,为什么在代码中有parent::__construct();

回答

11

__construct()是类的构造函数方法。如果你从中声明一个新的对象实例,它会运行。但是,它只运行它自己的构造函数,而不是它的父项。例如:

<?php 

class A { 
    public function __construct() { 
    echo "run A's constructor\n"; 
    } 
} 

class B extends A { 
    public function __construct() { 
    echo "run B's constructor\n"; 
    } 
} 

// only B's constructor is invoked 
// show "run B's constructor\n" only 
$obj = new B(); 

?> 

在这种情况下,如果你需要的时候被宣布$ obj转换为运行A类的构造函数,你需要使用parent::__construct()

<?php 

class A { 
    public function __construct() { 
    echo "run A's constructor\n"; 
    } 
} 

class B extends A { 
    public function __construct() { 
    parent::__construct(); 
    echo "run B's constructor\n"; 
    } 
} 

// both constructors of A and B are invoked 
// 1. show "run A's constructor\n" 
// 2. show "run B's constructor\n" 
$obj = new B(); 

?> 

CI中的情况下,该行运行CI_Controller中的构造函数。该构造方法应该以某种方式帮助您的控制器代码。你只是想让它为你做一切。

+0

你b声明中缺少父扩展 – drk 2013-02-25 09:46:31

+0

'B类扩展A'是正确的 – 2013-02-25 09:49:12

+1

所以我们需要对那些在类似的方法新类的其他方法做同样的父类,并希望使用其父功能?或者这只是用于'__construct()'类? – 2013-02-25 09:53:49

2

扩展用于所有类。 __construct()用于您使用的那个类。

具有构造函数方法的类在每个新创建的对象上调用此方法,因此它适用于该对象在使用之前可能需要的任何初始化。

1

我相信调用父类的构造的需要/法是代码味道,被称为调用超。除了错误敏感性(忘记这个调用,你可以得到意想不到的结果),它是程序性的而不是OOP。毕竟,陈述的顺序也会导致意想不到的结果。

在这里阅读更多:https://martinfowler.com/bliki/CallSuper.html