Видимость метода при расширении абстрактного класса в PHP

0

В моем абстрактном классе 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() происходит из дочернего или родительского класса.

Заранее спасибо.

  • 4
    Как правило, всегда используйте защищенный, если у вас нет особой причины, почему он должен быть закрытым
  • 0
    возможный дубликат PHP: публичный, частный, защищенный
Показать ещё 10 комментариев
Теги:
oop

1 ответ

0

Однострочный: защищенный, потому что вы хотите, чтобы ваши дочерние классы имели доступ


Модификаторы видимости работают следующим образом:

  • общественность: видимая отовсюду.
    • $c = new My_Class_Extended(); $c->thisIsPublic(); , Это не работает с частными или защищенными
  • protected: видимый внутри класса и его дочерние классы
    • Вы можете вызывать только эти функции внутри функции, принадлежащей классу, который происходит от вашего родительского класса или самого родительского класса.
  • private: видна только для класса, в котором он определен. Вы не можете вызывать частные функции в дочерних классах и вне класса.

Модификаторы заказываются включительно. Таким образом, защищенный является более ограничительным, чем общедоступный, а частный более ограничительный, чем защищенный.

Вы хотите защитить, потому что вы хотите вызвать их внутри дочернего класса, но не за его пределами.


Кстати: в вашем контексте ключевое слово abstract гарантирует, что вы не сможете создать экземпляр из My_Class.

  • 0
    «Вы хотите защищаться, потому что хотите вызывать их внутри дочернего класса, но не вне его». Но, учитывая мой сценарий, действительно ли вызов My_Class::foo() происходит из дочернего класса? я не уверен
  • 1
    ааа! Я неправильно понял ваш вопрос. В вашем примере это не от дочернего класса. Таким образом, вы можете сделать это частным. Но это не позволит вам вызвать его внутри My_Class_Extended . Если вы также хотите иметь возможность вызывать его внутри My_Class_Extended вы должны сделать его защищенным.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню