2011-01-24 36 views
5

Estoy trabajando en un Bot IRC de PHP, y actualmente estoy trabajando en los comandos.¿hay alguna manera de "excluir" un archivo con PHP?

Al comienzo de main.php, la secuencia de comandos que inicia el bot, incluye el archivo class_lib.php y crea una instancia del objeto de esa clase. Quiero trabajar en un comando !reload, donde "no incluiría" el archivo y luego volverá a incluirlo. ¿Sería eso posible, o estaría bien si simplemente lo volviera a include d cuando se envió ese comando?

EDITAR: Básicamente, quiero ser capaz de modificar y volver a cargar la clase sin tener que reiniciar el bot.

+0

Debe explicar lo que está tratando de lograr, o más específicamente por qué. Simplemente puede reinstalar el objeto descargando y recargando la definición de clase. – mario

+0

¿Volverá a cargar el script? – Rob

+0

¿Por qué una nueva instancia de MyClass() no funcionará? – lepe

Respuesta

2

¿Por qué no permitir que el objeto vuelva a cargar la configuración predeterminada o reiniciar en lugar de lo que usted describe? Estoy bastante seguro de que no puedes hacer eso de todos modos.

Además, no intente cargar el objeto con class_lib.php. Incluya el archivo de clase con el objeto, luego, donde y cuando lo necesite, cree su objeto. De esa forma, puede detenerlo, destruir el objeto y luego volver a crear instancias de otro objeto, que debe lograr lo que desea.

+0

No estoy seguro de cómo destruir el objeto – Rob

+0

unset ($ objectvar). http://php.net/manual/en/function.unset.php –

+0

Si está destruyendo un objeto que ha creado conexiones de bases de datos u otro tipo de actividades en las que hay recursos abiertos, también debe crear un $ objectvar- > función destroy() dentro de la clase de objeto para cerrar todos los recursos, guardar todo lo que necesita ser guardado, y ENTONCES desarmado ($ objectvar). –

1

Me temo que no hay forma de incluir un archivo. Si se trata de una función, puede generar una nueva función de forma dinámica cada vez.

Comprobar:

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

se puede asignar una función a una variable y luego claro que la variable y asignarle de nuevo.

4

No, no puedes. Revisa tu diseño. No acople la definición de la clase con la instanciación del objeto.

+0

OOAD es la respuesta. – akond

+0

la instanciación se realiza en main.php, mientras que la definición está en class_lib.php. – Rob

+0

@akond, ¿qué es OOAD? – Rob

1

respuesta tardía ..

Se puede crear una matriz que contiene los archivos y luego eval (file_get_contents ($ archivo))

He estado trabajando en mi propio cliente IRC llamado PITC y que puede ser el método que podría usar, es cómo he hecho cosas antes de

+2

Oh las maravillas de 'eval'. Eso fue sarcástico por cierto. –

+0

include $ filename hace exactamente lo mismo. – AbiusX

0

La cuestión es esencialmente sobre el desarrollo de complementos de php cargables dinámicamente en php que no causen interferencia con otros complementos o el código principal.

La única forma que conozco requeriría rediseñar el class_lib.php original y crear una clase 'Plugin' que actuaría como una clase proxy que en cada llamada a función/método ejecutaría una nueva instancia php y pasaría los argumentos de la función con una llamada json_decode y luego eco la respuesta con 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); 
} 

esto tendría que hacerse para cada función de llamada/método a través de una clase de proxy ... no es tan eficiente, y que nunca funcionaría para objetos matrices/asociativos que contienen referencias a recursos u otra variable unserializable referencias.

Otra opción más eficiente sería http://www.php.net/runkit que le permite interactuar con una instancia de php incorporada de larga ejecución.

0

tarde a la fiesta, pero tengo que mencionar la siguiente PHP-extensión:

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

La extensión runkit proporciona medios para modificar constantes, funciones definidas por el usuario, y las clases definidas por el usuario . También proporciona variables superglobales personalizadas y subinterpretadores integrables mediante sandboxing.

Esto le permitiría redefinir las clases, lo que sucede al analizar los archivos incluidos.

NOTA: No he usado esto, me encontré con esto después de investigar si era posible de alguna manera hotswap ciertas clases. No puedo garantizar la seguridad y no puedo proporcionar información práctica. Todavía.

Cuestiones relacionadas