FunPHP#7

Возможно вернемся к этим фантазиям в другой статье, где я покажу разные идеи применения фильтров для написания собственного 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

Leave a Reply