2011-01-24 14 views
5

Pracuję nad Botem IRC PHP, a ja aktualnie pracuję nad poleceniami.Czy istnieje sposób na "uninclude" plik z PHP?

Na początku main.php, skrypt, który uruchamia bota, zawiera plik class_lib.php i tworzy instancję obiektu tej klasy. Chcę pracować na komendzie !reload, w której "uninclude" plik, a następnie ponownie go. Czy to by było możliwe, czy też byłoby dobrze, gdybym po prostu ponownie, gdy to polecenie zostało wysłane?

EDIT: Zasadniczo chcę móc modyfikować i ponownie załadować klasę bez konieczności ponownego uruchamiania bota.

+0

Powinieneś wyjaśnić, co próbujesz osiągnąć, a dokładniej dlaczego. Możesz po prostu ponownie zainstalować obiekt z rozładowaniem i ponownym załadowaniem definicji klasy. – mario

+0

Czy to przeładuje skrypt? – Rob

+0

Dlaczego "nowa instancja MyClass()" nie działa? – lepe

Odpowiedz

2

Dlaczego po prostu nie zezwolić obiektowi na ponowne załadowanie ustawień domyślnych lub zrestartować, zamiast tego, co opisujesz? Jestem prawie pewna, że ​​i tak nie możesz tego zrobić.

Nie należy również ładować obiektu za pomocą klasy class_lib.php. Dołącz plik klasy do obiektu, a następnie gdzie i kiedy go potrzebujesz, stwórz swój obiekt. W ten sposób możesz go zatrzymać, zniszczyć obiekt, a następnie ponownie utworzyć inny obiekt, który powinien osiągnąć to, co chcesz.

+0

Nie jestem pewien, jak zniszczyć obiekt – Rob

+0

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

+0

Jeśli niszczysz obiekt, który utworzył połączenia z bazami danych lub inne rodzaje aktywności, w których znajdują się otwarte zasoby, powinieneś również utworzyć $ objectvar- > destroy() w klasie obiektu, aby zamknąć wszystkie zasoby, zapisać wszystko, co musi zostać zapisane, a THENT unset ($ objectvar). –

1

Obawiam się, że nie można odłączyć pliku. Jeśli jest to funkcja, za każdym razem można dynamicznie generować nową funkcję.

Sprawdź:

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

można przypisać funkcję do zmiennej, a następnie stwierdzić, że zmienna i przypisać ją ponownie.

4

Nie, nie możesz. Ponownie sprawdź swój projekt. Nie łącz definicji klasy z instancją obiektu.

+0

OOAD jest odpowiedzią. – akond

+0

tworzenie instancji odbywa się w main.php, podczas gdy definicja jest w class_lib.php. – Rob

+0

@akond, co to jest OOAD? – Rob

1

Późne odpowiedź ..

Można utworzyć tablicę zawierającą pliki i następnie eval (file_get_contents ($ filename))

Pracuję na własną rękę klient IRC o nazwie PITC i które mogą być Metoda, której mógłbym użyć, To, jak zrobiłem coś przed

+2

Oh cuda 'eval'. To było sarkastyczne przy okazji. –

+0

include $ filename robi dokładnie to samo. – AbiusX

0

Pytanie dotyczy głównie tworzenia dynamicznie ładowanych wtyczek php w php, które nie powodują zakłóceń z innymi wtyczkami lub głównym kodem.

Jedyny znany mi sposób wymagałby przeprojektowania oryginalnej wersji class_lib.php i stworzenia klasy "Plugin", która działałaby jako klasa proxy, która na każdym wywołaniu funkcji/metody wykonałaby nową instancję php i przekazała argumenty funkcji z wywołaniem json_decode, a następnie echo odpowiedzi z 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); 
} 

to musiałyby być zrobione dla każdej funkcji/wywołania metody poprzez klasę proxy ... nie tak skuteczny, i nigdy nie będzie pracować dla obiektów/tablic asocjacyjnych, które posiadają odnośniki do zasobów lub innej zmiennej unserializable referencje.

Inną bardziej wydajną opcją byłaby http://www.php.net/runkit, która pozwala na interakcję z długo działającą wbudowaną instancją php.

0

późno do partii, ale muszę wspomnieć następujące PHP-extension:

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

Rozszerzenie runkit zapewnia środki do modyfikacji stałych, funkcji zdefiniowanych przez użytkownika, i klas zdefiniowanych przez użytkownika . Zapewnia również niestandardowe zmienne superglobalne i osadzalne podprocesory za pośrednictwem piaskownicy.

Pozwoliłoby to na ponowne zdefiniowanie klas, co dzieje się podczas analizowania dołączonych plików.

UWAGA: Nie użyłem tego, natknąłem się na to po zbadaniu, czy możliwe było jakoś podniecenie niektórych klas. Nie mogę ręczyć za bezpieczeństwo i nie mogę dostarczyć informacji praktycznych. Jeszcze.

Powiązane problemy