В следующем коде PHP будет недоволен тем, что customMethod() является закрытым. Почему это так? Определяется ли видимость, где что-то объявлено, а не определено?
Если бы я хотел, чтобы customMethod был только видимым для шаблона кода в классе Template и не позволял ему переопределяться, мог бы я просто сделать его защищенным и окончательным?
template.php:
abstract class Template() {
    abstract private function customMethod();
    public function commonMethod() {
        $this->customMethod();
    }
}
CustomA.php:
class CustomA extends Template {
    private function customMethod() {
       blah...
    }
}
main.php
...
$object = new CustomA();
$object->commonMethod();
..