Разбор интересного задания на PHP

Введение

На одном собеседовании на должность 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']);

comments powered by Disqus