Как устроена обработка классов в PHP?

Я считал, что объекты и статические вызовы классов основываются на том, как мы описали их.
В данном примере изменяя родительский класс мы влияем на то, каким будет дочерний.
abstract class A {
    public static $constraints = true;
    
    public static function noConstraints(Closure $callback) {
        static::$constraints = false;
        
        return $callback();
    }
}

class B extends A {
    public function show()
    {
        var_dump(static::$constraints);
    }
}

(new B)->show(); // true

A::noConstraints(function() {
    (new B)->show(); // false
});

Насколько я понял, php в какой-то момент создает "шаблон" класса, который использует для создания объектов, статических вызовов, наследования. Используя статические методы/свойства мы можем влиять на состояние "шаблона".

Объясните как это работает.
  • Вопрос задан
  • 132 просмотра
Пригласить эксперта
Ответы на вопрос 4
delphinpro
@delphinpro Куратор тега PHP
frontend developer
Переменная $constraints принадлежит классу, не объекту.
Вы меняете ее вызовом A::noConstraints()
Теперь эта переменная false
Потом вы создаете объект на основе класса в котором эта переменная изменена.
По-моему всё логично.

UPD
Даже не так.

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

С таким кодом должен быть аналогичный результат.

$b = new B;
$b->show(); // true

A::noConstraints(function() use($b) {
    $b->show(); // false
});
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
В первом приближении - при обращении к константе, переменной или методу класса, если такового не найдено, то используется соответствующий член родительского класса.
В классе B не переопределена статическая переменная $constraints, поэтому при обращении к B::$constraints реальное обращение происходит к A::$constraints. И, так как эта переменная статическая, то она создаётся не для каждого экземпляра, а для самого класса.
Ответ написан
Комментировать
Adamos
@Adamos
Насколько я понял, php в какой-то момент

Ты просто не понял, что такое static в ООП в принципе. Вот и выдумываешь странные теории.
Static-член - это ОДНА переменная на все экземпляры класса и его наследников.
Сделать ее другой в наследниках можно, указав в них свою переменную с таким же именем.
Но это практически заведомый говнокод, и так просто не делают.
Ответ написан
Комментировать
SilenceOfWinter
@SilenceOfWinter Куратор тега PHP
та еще зажигалка...
при работе со статическими переменными и методами не создается экземпляр объекта. тут все немного сложнее, self::$constraints - это статическое свойство класса указывающее на значение класса в котором оно непосредственно вызывается(A), а static::$constraints - это так называемое позднее статическое связывание и свойство хранит значение текущего класса (B)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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