2010-12-14 3 views
2

Есть ли возможность уменьшить уровень доступа к функции в производном классе в PHP?уменьшить уровень доступа к функции в производном классе

пример (... означает больше кода)

class foo 
{ 
    public function myFunction() { ... } 
    public function myOtherFunction() { ... } 
} 

class bar extends foo 
{ 
    private function myFunction() { ... } 
} 

Теперь я should'nt быть в состоянии назвать MyFunc ион bar объекта. Но делать это таким образом, похоже, не имеет значения в PHP. Любым другим путем? Я знаю, что могу реализовать пустую функцию, но я вообще не хочу раскрывать эту функцию в интерфейсе.

ответ

4

В противном случае он не действует в ООП. Если вы реализуете общедоступный метод, вы обещаете, что этот класс и все дети предоставляют эту функцию. Чтобы удалить общедоступный метод означает, что вы нарушаете свои обещания;) Поскольку все общедоступные методы и свойства определяют интерфейс класса и разрыв интерфейса никогда не является хорошей идеей.

Без какой-либо более четкой информации о том, что вы собираетесь делать, я предлагаю просто выбросить исключение, что-то вроде «Не поддерживается».

+0

Мысль о том, что у меня есть абстрактный класс, который имеет функцию registerObject(), а затем у меня есть класс, расширяющий его и имеющий функцию registerForm(), которая на самом деле просто вызовет parent :: registerObject(), но будет более подходящее имя для рассматриваемого объекта. Но вы правы, это плохая практика, когда я думаю об этом:) ... Я должен, вероятно, создать защищенную функцию registerObject(), а затем иметь публичную функцию registerForm() в производном классе и так далее. – inquam

+0

У нас есть класс OurException extends Exception. У нас есть два способа создания экземпляра OurException. Из-за врожденной неспособности PHP встраивать __construct в элегантном стиле, мы хотели бы создать 2 статических метода, т.е. OurException :: newA и OurException :: newB (из моих исследований это выглядит довольно стандартным способом перехитрить перегрузку). Но мы не хотим, чтобы люди использовали «новое OurException», поэтому хотели бы защитить __construct или private. Это невозможно, потому что Exception __construct является общедоступным. – Pancho

+0

... продолжение. К сожалению, в нашем контексте не имеет смысла бросать исключение «Не поддерживается», когда происходит исключение Exception. Если PHP мог бы надежно перегрузить конструктор, тогда было бы гораздо более разумным придерживаться ООП «обещание», которое вы упомянули выше. Однако, без чистой перегрузки, невозможность «уменьшить доступность к __construct» в нашем контексте очень проблематична ... и я действительно не уверен, как обойти проблему :( – Pancho

Смежные вопросы