Каково влияние видимости на поздние статические привязки в нестационарном контексте в PHP? [Дубликат]

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

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

3
задан renatov 9 February 2014 в 03:27
поделиться

1 ответ

Проблема с вашим кодом заключается в том, что метод Bar::testPrivate - private, поэтому он не может быть переопределен дочерними классами. Во-первых, я рекомендую вам ознакомиться с видимостью в PHP - http://www.php.net/manual/en/language.oop5.visibility.php . Там вы узнаете, что только методы public и protected класса членов класса могут быть переопределены, private не могут.

В качестве хорошего примера попробуйте изменить видимость метода Bar::testPrivate либо публичным, либо защищенным, без изменения чего-либо еще в вашем примере кода. Теперь попробуйте выполнить ваши тесты. Что происходит? Это:

PHP Неустранимая ошибка: уровень доступа к Foo :: testPrivate () должен быть защищен (как в классе Bar) или слабее

Большой вопрос вот почему?". Ну, теперь вы переопределили Bar::testPrivate с помощью частного Foo:testPrivate. Этот новый частный метод недоступен для Bar::test, поскольку частные члены класса видны только для их текущего класса, а не родительского / дочернего классов!

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

4
ответ дан Mark 19 August 2018 в 11:43
поделиться
  • 1
    Верьте или нет, код, который я опубликовал, - это ссылка, которую вы предложили, официальное руководство PHP, касающееся части видимости. Это часть примера №2. – renatov 9 February 2014 в 03:49
  • 2
    Да, и хотя на этом примере не хватает объяснений того, что он делает, он на самом деле иллюстрирует, что видимость private означает в терминах переопределения метода (что он не может быть выполнен). – Mark 9 February 2014 в 03:52
  • 3
    О, я понимаю это сейчас. Но у меня есть другой вопрос. A "защищенный" метод не должен быть доступен из других объектов, но таким образом он был доступен, не так ли? Это похоже на обходной путь для вызова защищенного метода. Разве это не нарушение инкапсуляции? – renatov 9 February 2014 в 04:20
  • 4
    Нет, он никак не нарушает инкапсуляцию, так как так оно и было. Доступ к защищенным классам может выполняться родительскими / дочерними классами, когда они являются экземплярами одного и того же класса (т. Е. Вы расширяете класс с защищенными членами). PS: обычно принято выбирать ответ, если он удовлетворяет ваши потребности – Mark 9 February 2014 в 10:14
Другие вопросы по тегам:

Похожие вопросы: