Desidero accedere a metodi e variabili private dall'esterno delle classi in casi molto rari.Chiama metodi privati e proprietà private al di fuori di una classe in PHP
Ho visto che questo non è possibile anche se si utilizza l'introspezione.
Il caso specifico è la prossima:
Vorrei avere qualcosa di simile:
class Console
{
final public static function run() {
while (TRUE != FALSE) {
echo "\n> ";
$command = trim(fgets(STDIN));
switch ($command) {
case 'exit':
case 'q':
case 'quit':
echo "OK+\n";
return;
default:
ob_start();
eval($command);
$out = ob_get_contents();
ob_end_clean();
print("Command: $command");
print("Output:\n$out");
break;
}
}
}
}
Questo metodo dovrebbe essere in grado di essere iniettato nel codice come questo:
Class Demo
{
private $a;
final public function myMethod()
{
// some code
Console::run();
// some other code
}
final public function myPublicMethod()
{
return "I can run through eval()";
}
private function myPrivateMethod()
{
return "I cannot run through eval()";
}
}
(questa è solo una semplificazione, quella vera passa attraverso un socket e implementa un sacco di altre cose ...)
Quindi ...
Se si crea un'istanza della demo di classe e si chiama $ demo-> myMethod(), si otterrà una console: che console può accedere al primo metodo di scrittura un comando come:
> $this->myPublicMethod();
Ma non si può eseguire correttamente la seconda:
> $this->myPrivateMethod();
Qualcuno di voi ha qualche idea, o se c'è qualche libreria per PHP che ti permette di fare questo?
Grazie mille!
Erm ... Chi vorrebbe mai rendere i metodi etichettati privati accessibili al pubblico? Voglio dire ... se hai bisogno di accedervi dall'esterno, basta usare il pubblico. Inoltre: la classe della tua console non ha senso nel modo in cui l'hai aggiunta qui. Non fa un singolo uso di OOP ed è fondamentalmente solo una funzione forzata in una classe. – lamas
FYI 'while (true)' o 'for (;;)' sono metodi un po 'più succinti e comuni di loop fino a quando non si incontra un 'break' o' return' esplicito. – meagar
@lamas: Come ho detto in precedenza, ho fatto questo più come un POC di un esempio reale. La vera classe Console ha più o meno circa 1k linee e ne estende altre per composizione.La manutenibilità del codice non è un problema dato che verrà usato come componente isolato al di fuori del progetto principale per cui stiamo lavorando, quindi non è solo "una funzione forzata in una classe", ma un estratto da una classe che non essere pubblicato qui per evitare che la gente si infastidisca. :) @meagar: hehe, ho fatto il tempo (TRUE! = FALSE) come uno scherzo, dal momento che PHP convalida FALSE! = 0 come FALSE. grazie comunque;) –