Что такое static в ООП php?

Здравствуйте, объясните пожалуйста новичку, что значит слово static в ООП php? В каких целях его используют и зачем?
  • Вопрос задан
  • 8379 просмотров
Решения вопроса 2
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Для этого вам надо понимать в чем разница между классами и объектами. Вот есть методы и свойства объектов а есть методы и свойства классов. Последние как раз статические свойства и методы. Отсюда и все особенности их работы и возможные варианты использования. Класс у нас в системе может быть только один, а экземпляров этого класса (объектов) много.

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

$foo = Singleton::instance();
$bar = AbstractFactory::create('bar');
$buz = Buz::fromArray([
    'many' => 'arguments', 'Buz' => 'has', 'private' => 'constructor'
]);


В PHP статику еще любят применять как замену обычным функциям в силу того, что для классов автозагрузка у нас есть, а для функций нету. Не сказать что это сильно хорошо, я бы даже сказал что это плохо. Учитывая что сейчас есть composer а благодаря opcache оверхэда от подключения для каждого запроса файла особо и нет. В целом лучше стараться избегать использования статики или во всяком случае делать в статических методах хоть сколько нибудь сложные вещи. И лучше всегда ограничиваться только случаями для порождения объектов, тут статика выглядит логично.

Если рассматривать с точки зрения пораждающиз статических методов, нам так же надо знать кого создавать. И тут появляются два ключевых слова - self и static. Причем self равносильно написанию имени класса в котором наш статический метод находится и просто позволяет уменьшить дублирование. static же намного интереснее, так как оно указывает непосдерственно на тот класс, из под которого был совершен вызов. Скажем если у вас есть наследование вы можете запихнуть порождающий метод в базовый класс, и тогда узнать кого создавать в принципе не проблема.

class Foo {
    public static function createWithSelf() {
         // равносильно new Foo();
         return new self();
    }
    public static function createWithStatic() {
         // а тут мы пока не знаем кто такой этот static
         $foo = new static();
    }
}

class Bar extends Foo {}

$foo = Bar::createWithSelf(); // тут будет экземпляр Foo
$bar = Bar::createWithStatic(); // тут будет экземпляр Bar
Ответ написан
iiifx
@iiifx
PHP, OOP, SOLID, Yii2, Composer, PHPStorm
Для доступа к статическим методам и членам класса
class SomeClass {

    public $a = 'isObjectValue';

    static $b = 'isStaticValue';

}

echo SomeClass::$b; # isStaticValue

$someClass = new SomeClass();
echo $someClass->a; # isObjectValue


к методам аналогично

Внутри класса есть еще self\static, но это чуть другое
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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