Come ti senti sull'utilizzo di riflessione?
$r = new ReflectionClass('MyClass');
$props = $r->getDefaultProperties();
$mock = new stdClass;
foreach ($props as $prop => $value) {
$mock->$prop = $value;
}
Non ho usato molto Reflection, solo per un'introspezione di base. Non sono sicuro se riuscirai a imitare completamente la visibilità, ecc. Usandolo, ma non vedo perché no se continui lungo il percorso di scrittura su una stringa e eval
ing.
Edit:
Scanned attraverso le funzioni di riflessione per curiosità, è del tutto possibile per imitare completamente la classe con metodi fittizi, attuazione vincoli piena visibilità, costanti e gli elementi statici, se del caso, se si costruisce in modo dinamico la classe in una stringa e eval
it.
Tuttavia sembra che sarà un completo missione per sostenere davvero completamente ogni possibilità, quando si tratta di ottenere i tipi di dati corretti (è necessario il codice per ricostruire un costruttore matrice da una matrice per esempio)
Buona fortuna se si va su questa strada, richiede più potenza del cervello di quanto io sono disposto a risparmiare in questo momento :)
Ecco un po 'di codice, è possibile fare la stessa cosa con le costanti, e creare metodi vuoti in modo simile.
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);
Solo per chiarezza, vuoi prendere in giro una classe esistente e dare alle tue finte proprietà predefinite di quella classe, senza in realtà creare un'istanza della classe che viene derisa? – Leigh
@Leigh Right, la classe verrà istanziata più in profondità nel framework. La classe che sto prendendo in giro è un modello astratto, e voglio dargli alcuni 'campi $ 'in modo che si comporti come un modello reale. So che PHPUnit crea mock scrivendo il codice in una stringa e evaling() esso. Non so come includere le dichiarazioni di proprietà in quel processo. –