无法将构造函数定义为protected或private!为什么?

Raf*_*ael 8 php

--- A.php ----
require_once 'B.php';

class A
{
    public function __constructor($x){...}

    public function foo()
    {
        $b = B::getInstance();
        ...
    }
}

--- B.php ----
require_once 'A.php';

class B extends A
{
    protected static $_instance = null;

    protected function __construct(){}

    public static function getInstance()
    {....}
}
Run Code Online (Sandbox Code Playgroud)

PHP只是在到达行时就停止解释代码

protected function __construct(){}
Run Code Online (Sandbox Code Playgroud)

并输出之前的所有内容以及之后未发送给浏览器的任何内容.

只要我把这条线取出来,就改成它

// protected function __construct(){}
Run Code Online (Sandbox Code Playgroud)

一切正常!?

我不明白.

有任何想法吗?

Ber*_*rak 12

我刚刚创建了一个简单的测试文件来确认这是否也发生在我的机器上,我想我已经找到了答案.请使用以下代码:

<?php
error_reporting( E_ALL | E_STRICT );
class Foo {
    public function __construct( ) {
    }
}

class Bar extends Foo {
    protected function __construct( ) {
    }
}
Run Code Online (Sandbox Code Playgroud)

当尝试执行该代码时,我收到致命错误:"PHP致命错误:Bar :: __ construct()的访问级别必须是第12行/home/berry/foo.php中的公共(如Foo类)" 这意味着你不能改变子类中的访问级别,如果父级已经定义了访问级别,这实际上很有意义:我想,PHP不知道要调用哪个构造函数.

作为旁注:通过查看你的代码,B扩展A,A使用B.为什么这样,对我来说这似乎是一个奇怪的结构?我猜你真的想要的是构图,而不是继承.


Álv*_*lez 6

可以将构造函数定义为protected或private.这段代码编译 因为OOP被重写为PHP/5而运行得很好:

<?php

class A{
    public function __construct(){
        echo 'Instance of A created' . PHP_EOL;
    }
}

class B{
    protected function __construct(){
        echo 'Instance of B created' . PHP_EOL;
    }
}

class C{
    private function __construct(){
        echo 'Instance of C created' . PHP_EOL;
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,私有构造函数阻止您使用new关键字创建实例,但PHP将触发致命错误(它不会停止运行):

<?php

new A; // OK
new B; // Fatal error: Call to protected B::__construct() from invalid context
new C; // Fatal error: Call to private C::__construct() from invalid context
Run Code Online (Sandbox Code Playgroud)

  • 只是为了弄清楚:该代码不会编译得很好。该代码将被很好地解释;) (2认同)
  • @Berry Langerak - 我*知道*我的词选择将是有争议的:) (2认同)