Возможно вернемся к этим фантазиям в другой статье, где я покажу разные идеи применения фильтров для написания собственного DSL.
Кстати, Александр предложил написать статью и разобрать его фреймворк GoAOP.
По его словам мало людей в мире могут это сделать ????.
Если вам, мои читатели, это интересно — напишите в комментариях, пожалуйста, нужно ли разобрать или в сети достаточно информации?Продолжим… Если вы помните, то Паблик Морозов всячески показывал как получить доступ к приватным и протекдем свойствам и методам.
Мы там пропустили примеры закрытых классов — когда есть приватный конструктор.
Допустим есть какой-то синглтон:<?php declare(strict_types=1);class Singleton { private static $instance; public $foo = 0; private function __construct() { $this->foo = 123; } public static function instance(): self { if (!self::$instance) self::$instance = new self; return self::$instance; }};Нужна возможность получить больше 1го инстанса, что делать?Самый простой случай это просто склонировать созданный объект и далее его модифицировать:$foo1 = Singleton::instance();$foo2 = clone $foo1;По этой причине закрывают клонирование через добавление:private function __clone() {}Вот теперь уже просто склонировать не получится.
Но, вспоминая примеры Паблика Морозова, мы можем обойти этот запрет через:$foo1 = Singleton::instance();$foo2 = (function() { return clone $this; })->bindTo($foo1, Singleton::class)();$foo1->foo = 456;var_dump($foo1); // 456var_dump($foo2); // 123А что если это не Singleton и нет никакого метода instance?class Closed { private $foo = 0; private function __construct() { $this->foo = 123; } private function __clone() {} public function getFoo() { return $this->foo; }}Вообще полностью закрытый класс.
Мы можем заглянуть в документацию и посмотреть что нам предлагает ReflectionAPI, а предлагает он нам создать класс в обход конструктора:$foo = (new ReflectionClass(Closed::class)) -> newInstanceWithoutConstructor();var_dump($foo->getFoo()); // = int(0)Но есть минус и заключается он в том, что не будет выполнена логика, зашитая в конструктор.
Мы его можем вызвать опять же через функцию извне, привязав ее к контексту:(function() { return $this->__construct(); })->bindTo($foo, Closed::class)();var_dump($foo->getFoo()); // = int(123)Но если мы так заморочились, не проще ли сразу получить нужный инстанс через внешнюю функцию через привязку к контексту?$foo = (function() { return new static; }) ->bindTo(null, Closed::class)();Ну вот и все.
И конструктор сработал, и инстанс получили.
В конце статьи про Паблика Морозова был показан хак, как создавать stdClass с приватными свойствами.
И в комментариях там писали что можно использовать для взлома десериализатор.
Суть: мы можем сериализовать класс и посмотреть как он выглядит, если бы у него все методы были паблик:<?phpclass Closed { function __construct() {} }var_dump( serialize(new Closed()) );Получается строка:string(17) "O:6:"Closed":0:{}"Т.
е.
мы можем взять и составить такую же строку и провернуть все наоборот:class Closed { private function __construct() {} }$foo = unserialize( sprintf( 'O:%d:"%s":0:{}', strlen(Closed::class), Closed::class ) );И мы получим инстанс класса, от которого как бы нельзя было инстанцироваться.
Эта же техника применима и к методам и свойствам.
Другие статьи по темеFunPHP#6: Еще немного магии в PHP7UPD базы знанийmedium.
comFunPHP#5: access to private and protectedПаблик Морозов на собеседованииmedium.
comFun PHP #4Задачка с собеседованияmedium.
comFun PHP #3Значения по ссылкеmedium.
comFun JS/PHP #2JS versus PHP battlemedium.
comFun PHP #1Особенности поведенияmedium.
comБезумный PHP.
Фьюри кодСборник PHP ненормальностей или что надо знать чтобы не сойти с ума и не прострелить себе что-нибудь Прочитал статью…habr.
comЛайк, хлопок, шер.
Подписывайтесь на Телеграм канал.
Следить за обновлениями и прочими материалами от меня можно именно там: @prowebit .
В этом канале публикую различные новости и мысли, которых может не быть в этом блоге.
Подписывайтесь!???????????????? ???????????? — анонимный поиск работы без палева где можно найти новую работу без проблем на текущем месте.
Только для IT, никакого “левого” стафа.
Только релевантные предложения.
Скоро будет мега апдейт ;)New.
HR — место где помогают найти работу мечты.
Работаем только с отборными вакансиями в сфере IT & Digital.
Помогаем кандидатам найти работу по душе.
Работаем с кандидатами, которые не ищут работу!.. More details