Quiero acceder a métodos privados y variables desde fuera de las clases en casos específicos muy raros.Llamar a métodos privados y propiedades privadas desde fuera de una clase en PHP
He visto que esto no es posible aunque se usa la introspección.
El caso específico es el siguiente:
me gustaría tener algo como esto:
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;
}
}
}
}
Este método debe ser capaz de ser inyectada en el código como el siguiente:
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()";
}
}
(esto es solo una simplificación. El real pasa por un socket e implementa un montón de cosas más ...)
Entonces ...
Si usted instancia la clase Demo y se llama a $ demo-> myMethod(), obtendrá una consola: la consola se puede acceder al primer método de escribir un comando como:
> $this->myPublicMethod();
Pero no se puede ejecutar correctamente la segunda:
> $this->myPrivateMethod();
¿alguno de ustedes tiene alguna idea, o si hay alguna biblioteca para PHP que le permite hacer esto?
¡Muchas gracias!
Erm ... ¿Quién querría que los métodos etiquetados como privados sean de acceso público? Quiero decir ... si necesitas acceder desde afuera, solo usa el público. Además: su clase de consola no tiene sentido de la forma en que la agregó aquí. No hace un solo uso de OOP y es básicamente una función forzada en una clase. – lamas
FYI 'while (true)' o 'for (;;)' son métodos de bucle un tanto más sucintos y comunes hasta que se encuentra un 'break' o' return 'explícito. – meagar
@lamas: Como dije anteriormente, he hecho esto más como un POC que como un ejemplo real. La clase de consola real tiene más o menos aproximadamente 1k líneas y se extiende a otras por composición.El mantenimiento del código no es un problema ya que se usará como un componente aislado fuera del proyecto principal para el que estamos trabajando, de modo que no solo se trata de "una función forzada en una clase", sino un extracto de una clase que no se publicará aquí para evitar que la gente se enoje. :) @meagar: jeje, hice el tiempo (¡VERDADERO! = FALSO) como una broma, ya que PHP valida FALSO! = 0 como FALSO. gracias de todos modos;) –