PHP抽象类和受保护的方法

时间:2017-01-28 14:49:23

标签: php design-patterns abstract protected

就像标题一样,我对此代码有疑问:

abstract class AClass {
    abstract protected function a1();
    abstract protected function a2();

    public function show() {
        return $this->a1() . "<br>" . $this->a2();
    }
}


class A1 extends AClass {

    protected function a1() {
        return 'A1a1';
    }

    protected function a2() {
        return 'A1a2';
    }
}

class A2 extends AClass {

    protected function a1() {
        return 'A2a1';
    }

    protected function a2() {
        return 'A2a2';
    }
}

class AA {

    public function __construct() {
        $a11 = new A1();

        $a22 = new A2();

        $this->inter($a11);
        $this->inter($a22);
    }

    private function inter(AClass $class)  {
        echo $class->show();
    }
}

$aa = new AA();

投掷:

  

致命错误:从第38行的C:\ xampp \ htdocs \ Learning \ index.php中的上下文“AA”调用受保护的A1 :: a1()

第38行是:

$a11 = new A1();

如果我没有在该行调用a1(),我不明白为什么会抛出该错误。

谢谢和问候

哈维尔

1 个答案:

答案 0 :(得分:1)

在第38行,你创建了一个A1类的实例,所以构造函数被调用:它是第15行的function a1()。因为类名不区分大小写,所以构造函数名称也是如此。

由于构造函数受到保护,因此无法从类外部调用它。也许你可以创建一个公共静态函数,在没有实例化的情况下调用它,在其中你可以调用构造函数。它对Singleton类设计模式有好处。

如果你只想用普通方法测试抽象,只需重命名你的函数,这样它们就不会是构造函数。