¿Cómo se siente acerca del uso de la reflexión?
$r = new ReflectionClass('MyClass');
$props = $r->getDefaultProperties();
$mock = new stdClass;
foreach ($props as $prop => $value) {
$mock->$prop = $value;
}
No he usado Reflection mucho solo, solo para la introspección básica. No estoy seguro si podrá imitar completamente la visibilidad, etc. usarlo, pero no veo por qué no si continúa por la ruta de escribir en una cadena y eval
ing.
Editar:
escaneada a través de las funciones de Reflexión por curiosidad, es totalmente posible imitar plenamente la clase con métodos ficticias, la implementación de restricciones visibilidad completa, constantes y elementos estáticos en su caso si dinámicamente construye la clase en una cadena y eval
.
Sin embargo, parece que va a ser una completa misión para apoyar realmente plenamente todas las posibilidades cuando se llega a conseguir los tipos de datos correctos (necesitará código para reconstruir un constructor de matrices de una matriz, por ejemplo)
mejor de la suerte si vas por este camino, se requiere más energía del cerebro que yo estoy dispuesto a ahorrar ahora mismo :)
Aquí hay un poco de código, puede hacer lo mismo con las constantes, y crea métodos vacíos de una manera similar.
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);
Para mayor claridad, ¿quieres burlar una clase existente y darle a tu simulacro las propiedades predeterminadas de esa clase, sin crear una instancia de la clase que se está burlando? – Leigh
@Leigh Right, la clase se instanciará más profundamente en el marco. La clase de la que estoy burlando es un modelo abstracto, y quiero darle algunos '$ campos' para que se comporte como un modelo real. Sé que PHPUnit crea burlas al escribir el código en una cadena y evaluarlo(). Simplemente no sé cómo incluir declaraciones de propiedades en ese proceso. –