Возможно ли использовать последний метод статического класса?

Мне нужен класс для наследования другого класса. У меня есть статическая функция _init() в базовом классе, и я не хочу, чтобы этот метод был унаследован в производном классе. Я пробовал final ключевое слово, но оно не работает. Что мне делать?

    Вы не понимаете, что означает окончательное.

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

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

    Например, представьте, что у вас есть класс, который определяет взаимодействие с платежным шлюзом. Поскольку все платежные шлюзы разные, вы не можете (или, по крайней мере, не должны) реализовать один класс, который может взаимодействовать с любым доступным шлюзом платежей. Но в целом платежные шлюзы работают одинаково. Отправляется запрос, включая сведения о кредитной карте пользователя и сумму, которую вы хотите дебетовать с карты. Платежный шлюз отвечает сообщением о том, разрешен ли платеж или нет.

    Вы бы реализовали такую ​​функциональность с абстрактным суперклассом, который определяет, как вы взаимодействуете с платежными шлюзами в целом, тогда вы создадите подкласс для каждого платежного шлюза, который вы хотите использовать (paypal, sagepay, что угодно).

    Поскольку все эти подклассы наследуются от одного и того же базового класса, вы можете быть уверены, что все они реализуют определенные методы, и вы можете без проблем отправлять сообщения этим методам. Пока класс оплаты, с которым вы имеете дело, является подклассом вашего абстрактного класса платежей, тогда все должно работать.

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

    Финал в PHP (и, действительно, большинство языков ООП, реализующих его или аналогичные понятия) означает «Это окончательная реализация этого метода. Если программист подклассифицирует меня, то он не может заменить мои конечные методы своей собственной реализацией». Это не означает, что методы не будут доступны в подклассе, просто вы не сможете их изменить.

    Если вам действительно нужно удалить функциональность из подкласса, вы можете сделать это, переопределив метод суперкласса и заменив его пустым методом (тот, который ничего не делает). Но не делайте этого, так как это вызовет проблемы типа, описанного выше.

    Как правило, если вы сталкиваетесь с ситуациями, когда у вас есть функциональность в суперклассе, который вам не нужен в подклассе, это запах кода, который говорит вам, что вам может потребоваться переосмыслить ваш дизайн.

    Static означает один для каждого класса, а не один для каждого объекта независимо от того, сколько экземпляров класса может существовать. Это означает, что вы можете использовать их, не создавая экземпляр класса. Статические методы неявно окончательны, потому что переопределение выполняется на основе типа объекта, а статические методы привязаны к классу, а не к объекту. Статический метод в суперклассе может быть затенен другим статическим методом в подклассе, если оригинальный метод не был объявлен окончательным. Однако вы не можете переопределить статический метод с помощью нестатического метода. Другими словами, вы не можете изменить статический метод в метод экземпляра в подклассе.

    Окончательный класс не может быть расширен, т. Е. Конечный класс не может быть подклассом. Окончательный метод нельзя переопределить, когда его класс наследуется. Вы не можете изменить значение конечной переменной (является константой).

    Вы делаете это неправильно.

    Просто тот факт, что вы хотите, чтобы расширенный класс не имел метода, означает, что вы нарушаете принцип замещения Лискова . Если чтение трудно: вот изображение, объясняющее это.

    Если у вас есть ситуация, когда вам нужно выполнить какую-то «работу» над объектом, прежде чем вы отпустите ее в приложение, вы должны использовать для нее Factory / Builder.

     class FooBuilder { public function create( $external_condition ) { $object = new Foo; if ( $external_condition->has_happened() ) { $object->set_condition( $external_condition ); }else{ $object->do_something_else(); } return $object; } } 

    Теперь вы всегда делаете экземпляры класса Foo через FooBuilder , объявление, когда вы расширяете Foo , у него нет никаких бесполезных методов.

    Кроме того, я бы сказал, что статические методы в классах являются признаком процедурного программирования. Статические переменные – это не что иное, как глобальные переменные, занесенные в пространство имен, маскирующиеся как класс.

    В POO, если класс B наследует другой класс A, класс B будет содержать все методы из класса A, это основа наследия POO. Поэтому I don't want that method to be inherited in the derived class . Вы должны посмотреть на другой механизм для этого.

    Кроме того, в most случаев такая ситуация (когда вы не хотите, чтобы производный класс наследовал метод) является признаком того, что ваш производный класс не должен наследовать вообще и где вы должны использовать другую систему.

    Проверьте этот пример:

     класс foo
     {
       private static $ stuff = array ('key1' => 1, 'key2' => 2);
    
       публичная конечная статическая функция getstuff ()
       {
        return self :: $ stuff;
       }
     }
    
    

    Я бы согласился с pomeh на ООП в PHP, и я также хотел бы добавить, что ключевое слово FINAL при использовании с методом на самом деле означает, что метод нельзя переопределить. Однако метод будет унаследован.