0

问题 1

在 CodeIgniter 中……我看到了一些奇怪的东西……例如:

父::__Construct(); 没有传递参数以加载到扩展类的构造中。

我认为它必须来自较旧的 PHP 版本......我真的不明白上面会做什么......如果你将一些东西传递给扩展类的构造,我只会看到价值。

class Sausage
{
    private $name;
    function __Construct( $something )
    {
        $this->name = $something;
    }
}

class Something extends Sausage
{
    parent::__Construct( "Hi" ); 
    echo $this->name; // outputs "Hi"
}

在 Codeigniter 中,他们不会将任何内容传递给 parent::_Construct .. 所以我不明白它的用途是什么:S

问题2

其次,这到底是什么意思:

self::$instance =& $this;

在 Code Igniter 的以下代码段中:

class CI_Controller {

 private static $instance;

 public function __construct()
 {
  self::$instance =& $this;

使 $instance 变量等于 $this?? 的引用 $this 不考虑静态上下文中的任何内容?我很困惑。

感谢您的帮助,完全让我在这里发疯。

4

3 回答 3

0

以下代码

parent::__Construct();

调用派生当前类的父类的构造方法,不传递参数,因为它不接受任何参数,调用很重要,因为当您从父类扩展子类时,您必须constructor显式调用它,否则,它的构造函数不会被调用。

以下代码(目标版本 4)

self::$instance = & $this;

由于,$instance是一个静态属性,为了访问它,他们使用self::$instance& $this用于将类实例分配为引用。

在这段代码private static $instance;中,该属性被声明为静态,即使在您第二次调用该类后它也会保持其状态,这意味着如果它包含该类的引用,那么它将不会再次分配它,所以您总是会得到该类只有一个实例,称为singleton设计模式,称为反模式,不推荐。

于 2013-11-01T16:22:40.847 回答
0

对于第一个问题,想象一下这样的设置:

class Animal {
    private $alive;
    public function __construct() {
        $this->alive = true;
    }
    public function isAlive() {
        return $this->alive;
    }
    public function kill() {
        $this->alive = false;
    }
}

class Dog extends Animal {
    private $sound;
    public function __construct() {
        $this->sound = "bark";
    }
}

$dog = new Dog;

如果我们现在调用会发生什么$dog->isAlive()?我们得到null,因为$alive从未设置过。您需要调用parent::__construct()in Dog::__construct,否则父函数中的引导将永远不会发生。

显然,在现实世界的情况下,构造函数会复杂得多,但这应该说明为什么parent::__construct()会使用它。

于 2013-11-01T16:14:01.507 回答
0

从 child调用parent::__construct()意味着我们希望在创建子对象时也调用父构造函数以及子构造函数。

传递参数取决于构造函数本身。即构造函数是如何定义的。

您并不总是需要将参数传递给函数以使其起作用;)

对于你的第二个问题,我认为这是

self::$instance =& $this;

您正在使您的静态变量$instance成为您自己的类的引用变量,即 $this

于 2013-11-01T16:20:41.753 回答