Как вы относитесь к использованию Reflection?
$r = new ReflectionClass('MyClass');
$props = $r->getDefaultProperties();
$mock = new stdClass;
foreach ($props as $prop => $value) {
$mock->$prop = $value;
}
Я сам не много использовал Reflection, только для базового самоанализа. Я не уверен, что вы сможете полностью имитировать видимость и т. Д., Используя его, но я не понимаю, почему нет, если вы продолжите идти по пути записи в строку и eval
ing.
Edit:
Сканирование с помощью функций Reflection из любопытства позволяет полностью имитировать класс с помощью фиктивных методов, реализующих ограничения полной видимости, константы и статические элементы, где это уместно, если вы динамически строите класс в строке и eval
Это.
Однако, похоже, это будет завершенная миссия , чтобы действительно полностью поддерживать все возможности, когда дело доходит до получения правильных типов данных (вам потребуется код для перестройки массива конструктор из массива например)
Желаю удачи, если вы пойдете по этому пути, для этого потребуется больше умственных способностей, чем я готов сейчас сэкономить:)
Вот немного кода, вы можете сделать то же самое с константами и создать пустые методы аналогичным образом.
class Test
{
private static $privates = 'priv';
protected $protected = 'prot';
public $public = 'pub';
}
$r = new ReflectionClass('Test');
$props = $r->getDefaultProperties();
$mock = 'class MockTest {';
foreach ($props as $prop => $value) {
$rProp = $r->getProperty($prop);
if ($rProp->isPrivate()) {
$mock .= 'private ';
}
elseif ($rProp->isProtected()) {
$mock .= 'protected ';
}
elseif ($rProp->isPublic()) {
$mock .= 'public ';
}
if ($rProp->isStatic()) {
$mock .= 'static ';
}
$mock .= "$$prop = ";
switch (gettype($value)) {
case "boolean":
case "integer":
case "double":
$mock .= $value;
break;
case "string":
$mock .= "'$value'";
break;
/*
"array"
"object"
"resource"
*/
case "NULL":
$mock .= 'null';
break;
}
$mock .= ';';
}
$mock .= '}';
eval($mock);
var_dump(new MockTest);