2017-01-28 16 views
2

Как название, у меня есть проблема с этим кодом:PHP абстрактные классы и защищенные методы

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(); 

Он бросает:

Fatal error: Call to protected A1::a1() from context 'AA' in C:\xampp\htdocs\Learning\index.php on line 38

линия 38 является следующее:

$a11 = new A1(); 

Я не понимаю, почему он бросает эту ошибку, если я не вызываю a1() в этой строке.

Спасибо и привет

Хавьер

+0

Вы используете одну из немногих версий PHP, поддерживающих конструкторы, названные в классе? http://php.net/manual/en/language.oop5.decon.php –

+0

Я использую PHP версии 5.6.20, похоже, что он поддерживает их, не так ли? –

+0

С вашего кода это выглядит так. Какое поведение конструктора вы хотите? –

ответ

1

В строке 38 вы создаете экземпляр класса А1, поэтому конструктор вызывается: это function a1() по линии 15. Так как имена классов чувствительны к регистру, поэтому также являются именами конструкторов.

Поскольку ваш конструктор защищен, его нельзя вызывать из-за пределов класса. Возможно, вы можете сделать публичную статическую функцию, вызвать ее без создания экземпляра и внутри нее вы можете вызвать конструктор. Это может быть полезно для шаблона проектирования класса Singleton.

Если вы хотите протестировать только абстракцию обычными методами, просто переименуйте свои функции, чтобы они не были конструкторами.

+0

Спасибо, что это была проблема, я не знал о без учета регистра конструкторов. –

+0

@GezaBoehm Шляпы для этого ответа. +1. – CKing