2011-01-24 17 views
5

Sto lavorando su un IRC Bot PHP e attualmente sto lavorando ai comandi.c'è un modo per "non includere" un file con PHP?

All'inizio di main.php, lo script che avvia il bot, include il file class_lib.php e crea un'istanza dell'oggetto di quella classe. Voglio lavorare su un comando !reload, dove dovrebbe "non includere" il file e quindi reincluderlo. Sarebbe possibile, o sarebbe bello se io solo include d ancora una volta quando questo comando è stato inviato?

MODIFICA: Fondamentalmente, voglio essere in grado di modificare e ricaricare la classe senza dover riavviare il bot.

+0

Dovresti spiegare cosa stai cercando di realizzare, o più precisamente perché. È possibile semplicemente reinizializzare l'oggetto con lo scaricamento e il ricaricamento della definizione della classe. – mario

+0

Ricaricherà la sceneggiatura? – Rob

+0

Perché una "nuova istanza MyClass()" non funzionerà? – lepe

risposta

2

Perché non solo consentire all'oggetto di ricaricare le impostazioni predefinite, o riavviare, invece di ciò che descrivi? Sono abbastanza sicuro che non puoi farlo comunque.

Inoltre, non provare a caricare l'oggetto con class_lib.php. Includi il file di classe con l'oggetto, quindi dove e quando ne hai bisogno, crea il tuo oggetto. In questo modo puoi fermarlo, distruggere l'oggetto e quindi ripetere l'istanza di un altro oggetto, che dovrebbe portare a termine ciò che desideri.

+0

Non sono sicuro su come distruggere l'oggetto – Rob

+0

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

+0

Se stai distruggendo un oggetto che ha creato connessioni al database o altri tipi di attività in cui ci sono risorse aperte, dovresti anche creare un $ objectvar- > Funzione destroy() all'interno della classe dell'oggetto per arrestare tutte le risorse, salvare tutto ciò che deve essere salvato e POI non impostare ($ objectvar). –

1

Ho paura che non ci sia modo di non includere un file. Se si tratta di una funzione, è possibile generare ogni volta una nuova funzione in modo dinamico.

Check:

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

È possibile assegnare una funzione a una variabile e poi chiaro che variabile e assegnare di nuovo.

4

No, non è possibile. Rivisita il tuo design. Non accoppiare la definizione della classe con l'istanza dell'oggetto.

+0

OOAD è la risposta. – akond

+0

l'istanziazione è fatta in main.php, mentre la definizione è in class_lib.php. – Rob

+0

@akond, che cos'è OOAD? – Rob

1

risposta in ritardo ..

è possibile creare un array che contiene i file e quindi eval (file_get_contents ($ filename))

ho lavorato per conto mio client IRC denominato PITC e che possono essere il metodo che potrei usare, è come ho fatto roba prima

+2

Oh le meraviglie di 'eval'. A proposito, era sarcastico. –

+0

include $ filename fa esattamente la stessa cosa. – AbiusX

0

La domanda è essenzialmente sullo sviluppo di plugin php caricabili dinamicamente in php che non causino interferenze con altri plugin o il codice principale.

L'unico modo che conosco che richiedono di ridisegnare il class_lib.php originale e creare una classe 'Plugin' che avrebbe agito come una classe proxy che su ogni funzione chiamata di metodo/eseguire una nuova istanza php e passare lungo gli argomenti della funzione con una chiamata json_decode e quindi echo la risposta 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); 
} 

questo dovrebbe essere fatto per ogni singola funzione chiamata di metodo/via una classe proxy ... non è così efficiente, e non avrebbe mai funzionato per gli array oggetti/associativi che detengono i riferimenti a risorse o altra variabile unserializable Riferimenti.

Un'altra opzione più efficiente sarebbe http://www.php.net/runkit che consente di interagire con un'istanza php con esecuzione prolungata.

0

ritardo alla festa, ma devo menzionare i seguenti PHP-estensione:

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

L'estensione runkit fornisce mezzi per modificare costanti, funzioni definite dall'utente e classi definite dall'utente . Fornisce anche variabili superglobali personalizzate e subinterpreti incorporabili tramite sandboxing.

Ciò consentirebbe di ridefinire le classi, cosa che avviene analizzando i file inclusi.

NOTA: non l'ho usato, ci sono venuto dopo aver cercato se fosse possibile in qualche modo hotswap alcune classi. Non posso garantire per la sicurezza e non posso fornire informazioni pratiche. Ancora.

Problemi correlati