В моем абстрактном классе My_Class
меня есть метод My_Class::foo()
который вызван из другого метода, принадлежащего классу. Например:
abstract class My_Class {
function foo() {
// Stuff.
}
function bar() {
$this->foo();
}
// More methods etc...
}
Теперь я занимаюсь расширением своего абстрактного класса. Например:
class My_Class_Extended extends My_Class {
}
Как вы узнаете, My_Class::foo()
и My_Class::bar()
наследуются My_Class_Extended
.
Я никогда не хочу My_Class::foo()
будет называться вне My_Class
или My_Class_Extended
, так что я не знаю, чтобы сделать его видимость public
. Моя проблема в том, что я не уверен, чтобы сделать ее видимость protected
или private
.
Мой вопрос
Учитывая, как я называю My_Class::foo()
в приведенном выше сценарии, должен ли он быть protected
или private
? Я не уверен, что вызов My_Class::foo()
происходит из дочернего или родительского класса.
Заранее спасибо.
Однострочный: защищенный, потому что вы хотите, чтобы ваши дочерние классы имели доступ
Модификаторы видимости работают следующим образом:
$c = new My_Class_Extended(); $c->thisIsPublic();
, Это не работает с частными или защищеннымиМодификаторы заказываются включительно. Таким образом, защищенный является более ограничительным, чем общедоступный, а частный более ограничительный, чем защищенный.
Вы хотите защитить, потому что вы хотите вызвать их внутри дочернего класса, но не за его пределами.
Кстати: в вашем контексте ключевое слово abstract гарантирует, что вы не сможете создать экземпляр из My_Class
.
My_Class::foo()
происходит из дочернего класса? я не уверен
My_Class_Extended
. Если вы также хотите иметь возможность вызывать его внутри My_Class_Extended
вы должны сделать его защищенным.