Что такое статические и динамические переменные / методы в ООП? - PullRequest
0 голосов
/ 13 сентября 2009

Я пытаюсь лучше понять основные понятия в ООП. Что такое статические и динамические переменные и методы в объектно-ориентированном программировании? В чем, например, разница между использованием $ this и двойного двоеточия (::)?

$ this ($ this-> a_method ())

  • Преимущества:?.
  • Недостатки:? ... «это» не является самодокументированным, как в: $this->method_from_an_extended_class().

Двойное двоеточие (someclass :: a_method ())

  • Преимущества:?
  • Недостатки:?

Ответы [ 2 ]

6 голосов
/ 13 сентября 2009

«Статический» и «динамический» не подходят для этого.

-> указывает функции экземпляра или данные экземпляра , что означает, что функция или данные имеют неявную ссылку $this. Другими словами, вы ссылаетесь на функцию или переменную в определенном объекте.

:: обозначает функцию класса или переменную класса . Это очень похоже на глобальную функцию или переменную, в которой нет неявной ссылки $this. Все экземпляры этого класса совместно используют эту функцию или переменную.

«Динамический» будет более точным описанием, скажем, перегрузки PHP , где вы можете «динамически» создавать переменные, например, используя магические методы __get() и __set() (которые Вызывается, когда вы пытаетесь получить доступ к свойству, которое не может быть найдено; вы можете перегрузить эти методы, чтобы фактически притвориться, что запрошенный элемент существует).

1 голос
/ 13 сентября 2009

Цитирование статической страницы в руководстве по PHP :

Объявление свойств или методов класса как статический делает их доступными без необходимости создания экземпляров класс . Недвижимость, объявленная как статические не могут быть доступны с экземпляр класса объекта (хотя статический метод может) .

Также обратите внимание, что при объявлении свойства как статического будет существовать только одна версия этого свойства для всего сценария: статические методы / свойства "действуют на уровне класса, а не на уровне экземпляра" (цитирование википедии ) .


О достоинствах / недостатках сложно ответить однозначно, поскольку они не совпадают ...

Вопрос: что вам нужно?

Если у вас есть объект, который содержит данные, и вы хотите, чтобы методы обрабатывали эти данные, вы будете использовать динамические свойства и методы.

С другой стороны, если вы просто хотите использовать класс в качестве контейнера для методов, которые работают с внешними данными (т. Е. Не являются внутренними для класса) , вы, вероятно, будете использовать статические методы.
Например, я иногда использую статические методы в качестве оболочек для библиотек, которые не экспортируют API Oriented-Object: он позволяет мне вызывать одну class::method вместо нескольких функций.


Кто-то скажет, что «преимущество» статических методов заключается в том, что вам не нужно создавать экземпляр класса для их использования - это правда; но это также означает, что вы не получаете объекты с методами, работающими с ними; хорошо: как я уже сказал, использование статического или нет зависит от того, что вам нужно.

О, я почти забыл: если вы хотите использовать модульное тестирование, вы можете обнаружить, что статические методы нелегко тестировать; например, см. Статические методы - смерть для тестирования .

И статические свойства (то же самое с шаблонами проектирования Singleton и реестра, которые основаны на статических свойствах / методах) подразумевает «глобальное состояние», такое как «глобальные переменные» - что некоторые не совсем как ^^

...