Абстрактные частные функции - PullRequest
25 голосов
/ 29 октября 2011

В следующем коде 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();
..

Ответы [ 4 ]

44 голосов
/ 29 октября 2011

Абстрактные методы не могут быть закрытыми, потому что по определению они должны быть реализованы производным классом. Если вы не хотите, чтобы оно было public, оно должно быть protected, что означает, что его могут видеть производные классы, но никто другой.

Руководство PHP по абстрактным классам показывает вам примеры использования protected таким образом.

2 голосов
/ 29 октября 2011

Абстрактные методы являются публичными или защищенными. Это обязательно.

1 голос
/ 27 апреля 2018

Если вы боитесь, что customMethod будет вызван вне класса CustomA, вы можете сделать CustomA класс final.

abstract class Template{
    abstract protected function customMethod();

    public function commonMethod() {
        $this->customMethod();
    }
}

final class CustomA extends Template {
    protected function customMethod() {

    }
}
0 голосов
/ 13 августа 2018

Ничто в PHP не является закрытым для дочернего класса для родительского класса.Ничто из закрытого в родительском классе невидимо для дочернего класса.

Помните, что при использовании абстрактных методов в PHP видимость должна передаваться между дочерним классом и родительским классом.Использование видимости private в этом сценарии с PHP полностью инкапсулирует CustomA::customMethod внутри CustomA.Ваши единственные варианты: public или protected видимость.

Поскольку вы не можете создать экземпляр абстрактного класса Template, сохраняется конфиденциальность клиентского кода.Если вы используете ключевое слово final для предотвращения расширения CustomA в будущих классах, у вас есть решение.Однако, если вам нужно расширить CustomA, вам придется пока жить с тем, как работает PHP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...