Введение
На одном собеседовании на должность php-разработчика было предоставлено своеобразное задание. Условие было поставлено следующее.
Дан фрагмент кода:
<?php
class A
{
private $x = 5;
}
$a = new A;
Требуется предложить как можно больше способов, которыми можно получить значение $x
.
Решение
Некоторые решения показались нестандартным и интересным. Предлагаю следующие варианты:
Способ 1. Reflection API
<?php
$reflectionClass = new ReflectionClass($a);
$property = $reflectionClass->getProperty('x');
$property->setAccessible(true);
var_dump($property->getValue($a));
Способ 2. Объект - замыкание
<?php
$getPrivate = function() {
return $this->x;
};
var_dump($getPrivate->call($a));
Способ 3. Конвертация в массив
<?php
var_dump(current((array)$a));
Способ 4. Регулярное выражение и сериализация
<?php
$str = serialize($a);
$pattern = '/.+?A.+?;.{1}:(?<x>.+?);.+?/';
preg_match($pattern, $str, $matches);
var_dump($matches['x']);