【问题标题】:PHP abstract classes and protected methodsPHP 抽象类和受保护的方法
【发布时间】:2017-06-14 03:31:04
【问题描述】:

就像标题说我对这段代码有问题:

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(),我不明白为什么会抛出该错误。

感谢和问候

哈维尔

【问题讨论】:

  • 您使用的是少数几个支持从类命名的构造函数的 php 版本之一吗? php.net/manual/en/language.oop5.decon.php
  • 我使用的是 PHP 5.6.20 版本,它看起来支持它们,是吗?
  • 从您的代码看来是这样。你想要什么样的构造函数行为?
  • 我正在测试抽象,因此我想测试由两个实现的父类中的公共无抽象方法调用的受保护方法。但我不知道为什么在 A1 构造函数 A1();正在调用 a1() 函数,如果我没有修改 A1 构造函数而不是 AClass 构造函数。

标签: php design-patterns abstract protected


【解决方案1】:

在第 38 行,您创建了 A1 类的实例,因此调用了构造函数:它是第 15 行的 function a1()。由于类名不区分大小写,因此构造函数名也是如此。

由于您的构造函数受到保护,因此不能从类外部调用它。也许您可以创建一个公共静态函数,无需实例化即可调用它,然后在其中调用构造函数。这对 Singleton 类设计模式很有好处。

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

【讨论】:

  • 谢谢你的问题,我不知道构造函数不区分大小写。
  • @GezaBoehm 为这个答案脱帽致敬。 +1。
猜你喜欢
  • 1970-01-01
  • 2015-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-04
  • 1970-01-01
  • 2015-03-30
  • 2016-03-19
相关资源
最近更新 更多