Возможный дубликат:
Когда использовать статические и инстанцированные классы
У меня есть небольшая проблема с пониманием преимуществ / недостатков статических vs «нормальных» классов в PHP, так как кажется, что я могу сделать то же самое с обоими.
Если я могу иметь статические переменные в классах и легко получать / изменять их со статическими методами, зачем мне даже нужны экземпляры класса?
Экземпляр Static
класса происходит только один раз, и его переменные доступны для любого экземпляра класса. Экземпляры имеют свои собственные индивидуальные значения, которые недоступны для других экземпляров, за исключением тех случаев, когда они помечены как static
.
Экземпляры полезны, когда будет более одного экземпляра класса.
Вы уверены, что не имеете в виду абстрактный класс? PHP имеет абстрактные классы и статические методы.
Абстрактный класс предоставляет вам механизм для создания объекта с обобщенным API, который может быть специализирован для различных других объектов, которые являются его подклассами, но для которых не существует смысла для существования экземпляра обобщенного класса. Например, если вы строите систему, управляемую животными, то у вас могут быть классы для определенных животных, таких как меркат, хорек, геккон, змея, рыба и т. Д. Некоторые из животных в системе могут быть сгруппированы по общему признаку. Например, все упомянутые животные являются позвоночными, поэтому у вас может быть класс позвоночных, который описывает характеристики, общие для всех животных, которые могут быть классифицированы как позвоночные.
Однако нет такого животного, как позвоночный, поэтому вы не должны иметь экземпляр класса Позвоночных. У вас могут быть экземпляры хорьков и змей, и эти экземпляры должны иметь все характеристики позвоночных, но экземпляр позвоночных не имеет смысла. Разумеется, вы можете также подкласса, у вас может быть класс млекопитающих и рептилий, которые находятся между позвоночными и конкретными животными, но которые также являются абстрактными и не могут иметь экземпляры.
В принципе, вы должны думать об абстрактном классе как способе определения общего поведения класса объектов, которые могут быть получены из него.
Извините, если я не очень хорошо себя объяснил, это гораздо проще понять, чем объяснять.
Если, с другой стороны, вы говорите о классах, которые не содержат ничего, кроме статических методов, то это просто способ для программиста обманывать себя, полагая, что процедурный код, который он пишет, является «объектно-ориентированным программированием». Это не так, это просто способ маскировки процедурного программирования.
Есть школы мысли, которые хмурятся статическими методами, поскольку они могут затруднить тестирование фрагментов кода в изоляции. Несмотря на то, что у них есть свое применение, обычно рекомендуется избегать статических методов.
Статический класс не нужно вводить с новым оператором. Это всегда полезно, тогда как «нормальный» класс должен быть инстансирован.
Класс instanced может иметь много экземпляров, у статического есть только один «экземпляр».
class StaticHello { static protected $sProperty = 'static'; static public function sayHello() { echo 'Hello, I am ' . self::$sProperty; } } class InstancedHello { protected $sProperty; public function __construct($name) { $this->sProperty = $name; } public function sayHello() { echo 'Hello, I am ' . $this->sProperty; } } StaticHello::sayHello(); // outputs "Hello, I am static" $oInstance1 = new InstancedHello('Rob'); $oInstance2 = new InstancedHello('Fbableus'); $oInstance1->sayHello(); // outputs "Hello, I am Rob" $oInstance2->sayHello(); // outputs "Hello, I am Fbableus"
Обратите внимание, что классы instanced могут иметь статические свойства и методы, разделяемые всеми экземплярами и доступные с помощью :: оператора
Вот хорошее объяснение: блог Карла Буньяна по PHP5 Статические классы