Есть ли способ «включить» файл с PHP? - PullRequest
7 голосов
/ 24 января 2011

Я работаю над PHP IRC Bot, и сейчас я работаю над командами.

В начале main.php, сценария, запускающего бота, он включает в себя class_lib.phpфайл и создает экземпляр объекта этого класса.Я хочу поработать с командой !reload, где она "отключит" файл, а затем снова включит его.Это было бы возможно, или было бы хорошо, если бы я просто include повторил это, когда эта команда была отправлена?

РЕДАКТИРОВАТЬ: В принципе, я хочу иметь возможность изменить и перезагрузитькласс без перезагрузки бота.

Ответы [ 6 ]

5 голосов
/ 24 января 2011

Нет, вы не можете. Пересмотрите свой дизайн. Не связывайте определение класса с созданием объекта.

2 голосов
/ 24 января 2011

Почему бы просто не позволить объекту перезагрузить настройки по умолчанию или перезапустить вместо того, что вы описываете? Я почти уверен, что ты все равно не сможешь этого сделать.

Также не пытайтесь загрузить объект с помощью class_lib.php. Включите файл класса с объектом, затем, где и когда вам это нужно, создайте свой объект. Таким образом, вы можете остановить его, уничтожить объект, а затем повторно создать экземпляр другого объекта, который должен выполнить то, что вы хотите.

1 голос
/ 24 января 2011

Боюсь, что нет способа удалить файл.Если это функция, вы можете генерировать новую функцию динамически каждый раз.

Проверка:

http://php.net/manual/en/function.create-function.php

Вы можете назначить функцию переменной, а затем очистить эту переменную и назначить ее снова.

0 голосов
/ 07 октября 2016

Поздно до вечеринки, но я должен упомянуть следующее PHP-расширение:

http://www.php.net/manual/en/book.runkit.php

Расширение runkit предоставляет средства для изменения констант, пользовательских функций и пользовательских классов. Он также предоставляет настраиваемые суперглобальные переменные и встраиваемые суб-интерпретаторы через песочницу.

Это позволит вам переопределить классы, что происходит при разборе включенных файлов.

ПРИМЕЧАНИЕ: я этим не пользовался, я наткнулся на это после исследования, можно ли каким-то образом «взломать» определенные классы. Я не могу ручаться за безопасность и не могу предоставить практическую информацию. Тем не менее.

0 голосов
/ 09 сентября 2015

Вопрос, по сути, заключается в разработке динамически загружаемых плагинов php в php, которые не вызывают помехи другим плагинам или основному коду.

Единственный известный мне способ потребовал бы от вас перепроектировать оригинальный class_lib.php и создать класс «Plugin», который бы действовал как прокси-класс, который при каждом вызове функции / метода выполнял бы новый экземпляр php и передавал аргументы функции с помощью вызова json_decode, а затем повторить ответ с помощью json_encode.

function proxyExternalFunction($fileName, $functionName, $args, $setupStatements = '') {
  $output = array();
  $command = $setupStatements.";include('".addslashes($fileName)."');echo json_encode(".$functionName."(";
  foreach ($args as $arg) {
    $command .= "json_decode('".json_encode($arg)."',true),";
  }
  if (count($args) > 0) {
    $command[strlen($command)-1] = ")";//end of $functionName
  }
  $command .= ");";//end of json_encode
  $command = "php -r ".escapeshellarg($command);

  exec($command, $output);
  $output = json_decode($output,true);
}

это должно быть сделано для каждого отдельного вызова функции / метода через прокси-класс ... не очень эффективно, и это никогда не сработает для объектов / ассоциативных массивов, которые содержат ссылки на ресурсы или другие несериализуемые ссылки на переменные.

Другим более эффективным вариантом будет http://www.php.net/runkit, который позволяет вам взаимодействовать с долго работающим встроенным экземпляром php.

0 голосов
/ 24 сентября 2012

Поздний ответ ..

Вы можете создать массив, содержащий файлы и затем eval (file_get_contents ($ filename))

Я работал над своим собственным IRC-клиентом по имени PITC, и это может быть метод, который я мог бы использовать. Это то, как я делал вещи до

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...