хорошо ли использовать self:: или static:: для нестатической функции?

я делаю некоторый oop в php, и когда я просто хотел знать, хорошо ли это делать? когда я использую $this->functionName(), он работает нормально, и я даже пробовал с self:: и static:: и они работают так, как я ожидал:

self:: будет использовать реализацию родительского метода, а static будет использовать последнюю реализацию метода, если она переопределена (поздняя статическая привязка). но проблема в том, что он используется для нестатической функции. это хорошо? есть ли у него недостатки?? почему я не должен его использовать?


person user2707590    schedule 02.11.2013    source источник


Ответы (1)


Подробное описание см. в этом ответе.

В общем, то, что вы описываете, возможно, и PHP это позволяет. Но помните, что люди привыкли к полиморфизму и переопределению методов, поэтому, если ваш базовый класс позволяет переопределить какой-либо метод, а затем использует self для его вызова, будет странно, что я не могу изменить поведение класса, хотя он предоставляет его в его API как метод public или protected.

ИМО, это нарушает принцип наименьшего удивления, упомянутый в книге Uncle Ben's Clean Code.

Кроме того, между привязками static и $this есть некоторые различия, потому что static всегда будет пытаться ссылаться на элемент в более узкой, не всегда подходящей области. Это поведение представлено в этом примере и объясняется в примечании выше, на которое я ссылаюсь здесь:

В нестатических контекстах вызываемый класс будет классом экземпляра объекта. Поскольку $this-> попытается вызвать частные методы из той же области, использование static:: может дать разные результаты. Еще одно отличие состоит в том, что static:: может относиться только к статическим свойствам.

Таким образом, хотя возможно использовать static в некоторых местах, где $this уместно, ключевые слова static были введены для использования статических методов и полей доступа, и их использование для других целей должно сбивать с толку.

person fracz    schedule 02.11.2013
comment
это не полностью отвечает на мой вопрос. мы можем использовать self::methodName() вместо $this-›methodName()... но хорошо ли это делать??? проблема полиморфизма не возникнет, если мы будем использовать static::methodName(), потому что это будет то же самое, что и $this-›methodName... так почему бы не self:: / static:: vs $this-› ??? - person user2707590; 02.11.2013
comment
пожалуйста, посмотрите мои правки, так как я привел больше аргументов против использования static для нестатических методов. - person fracz; 02.11.2013
comment
@user2707590 user2707590 Использование неправильного доступа не только сбивает с толку, но и генерирует предупреждающее сообщение! - person ComFreek; 02.11.2013