Я хочу получить доступ к приватным методам и переменным извне классов в очень редких случаях.Вызов частных методов и частных объектов извне класса в PHP
Я видел, что это невозможно, хотя интроспекция используется.
Конкретный случай является следующий:
Я хотел бы иметь что-то вроде этого:
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;
}
}
}
}
Этот метод должен быть в состоянии быть введен в коде, как это:
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()";
}
}
(это просто одно упрощение. Настоящий идет через розетку и реализует кучу еще вещей ...)
Итак ...
Если экземпляр класса Demo, и вы называете $ демо> MyMethod(), вы получите консоль: что консоль может получить доступ к первому способу написания команды, как:
> $this->myPublicMethod();
Но вы не можете успешно работать второй:
> $this->myPrivateMethod();
у кого из вас есть какие-либо идеи, или, если есть библиотека для PHP, что позволяет сделать это?
Большое спасибо!
Erm ... Кто бы хотел, чтобы методы, помеченные частным общедоступным? Я имею в виду ... если вам нужно получить доступ к нему извне, просто используйте публикацию. Также: ваш класс консоли не имеет смысла, как вы его добавили. Он не использует ООП в одиночку и в основном является просто функцией, запущенной в класс. – lamas
FYI 'while (true)' или 'for (;;)' - несколько более сжатые и распространенные методы цикла, пока не будут обнаружены явные 'break' или' return'. – meagar
@lamas: Как я уже говорил ранее, я сделал это больше как POC, чем настоящий пример. Настоящий класс консоли имеет более или менее около 1 тыс. Строк и расширяет некоторые другие по составу.Ремонтопригодность кода не является проблемой, поскольку она будет использоваться как изолированный компонент вне основного проекта, над которым мы работаем, так что это не только «функция, принудительная в класс», но и выдержка из класса, который будет не следует размещать здесь, чтобы люди не раздражались. :) @meagar: Хе-хе, я сделал это (TRUE! = FALSE) как шутка, так как PHP проверяет FALSE! = 0 как FALSE. спасибо в любом случае;) –