2011-01-24 17 views
5

私はPHP IRC Botで作業しています。現在、コマンドを処理中です。は、ファイルを "uninclude"する方法はありますか?

main.phpの先頭には、class_lib.phpファイルが含まれており、そのクラスのオブジェクトがインスタンス化されています。私は!reloadコマンドで作業して、ファイルを "uninclude"してから再び組み込みたいと考えています。それが可能であろうか、それともコマンドが送られたときに私がちょうどincludeになったらうまくいくのだろうか?

EDIT:基本的には、ボットを再起動しなくても、クラスを変更して再読み込みできます。

+0

達成しようとしていること、具体的には理由を説明する必要があります。クラス定義をアンロードして再ロードするだけで、オブジェクトを再インスタンス化できます。 – mario

+0

それはスクリプトをリロードしますか? – Rob

+0

「新しいMyClass()」インスタンスが機能しないのはなぜですか? – lepe

答えて

2

オブジェクトがデフォルト設定を再読み込みする、または再起動するだけではなく、説明するのではなく、私はあなたがそれをとにかく行うことができないと確信しています。

また、class_lib.phpでオブジェクトをロードしようとしないでください。オブジェクトにクラスファイルを含め、必要な場所と場所にオブジェクトを作成します。そうすれば、オブジェクトを停止し、オブジェクトを破棄し、別のオブジェクトを再インスタンス化することができます。これにより、目的を達成することができます。

+0

私はオブジェクトを破壊する方法については確信していません – Rob

+0

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

+0

オープンしているリソースがあるデータベース接続やその他の種類のアクティビティを作成したオブジェクトを破棄する場合は、$ objectvar- > destroy()関数を使用してすべてのリソースをシャットダウンし、保存する必要のあるものをすべて保存してから、unset($ objectvar)を実行します。 –

1

恐れ入りますが、ファイルをunincludeする方法はありません。それが関数の場合は、毎回新しい関数を動的に生成することができます。

チェック:

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

あなたは関数を変数に代入し、変数のこと、クリアして、もう一度それを割り当てることができます。

4

いいえ、できません。あなたのデザインを再訪してください。クラスの定義をオブジェクトのインスタンス化に結合しないでください。

+0

OOADは答えです。 – akond

+0

インスタンス化はmain.phpで行われますが、定義はclass_lib.phpにあります。 – Rob

+0

@akond、OOADとは何ですか? – Rob

1

後期答え..

あなたがファイルを含む配列を作成し、その後にeval(のfile_get_contents($ファイル名))ができ

私はPITCという名前の私自身のIRCクライアントに取り組んできた、それはかもしれ方法は私が使用するかもしれない、それは前に何かをした方法です

+2

ああ、 'eval'の驚異。それは途方もなく皮肉でした。 –

+0

include $ filenameはまったく同じことを行います。 – AbiusX

0

質問は本質的に他のプラグインやメインコードと干渉しない動的に読み込み可能なPHPプラグインをPHPで開発することです。

私が知っている唯一の方法は、元のclass_lib.phpを再設計し、すべての関数/メソッド呼び出しで新しいPHPインスタンスを実行して渡すプロキシクラスとして動作する 'Plugin'クラスを作成することです関数の引数に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); 
} 

これはそれほど効率的ではないプロキシクラスを経由してすべての単一の関数/メソッド呼び出し...のために行わなければならない、そしてそれは、リソースまたは他のunserializable変数への参照を保持するオブジェクト/連想配列のために働くことはありません参照。

さらに効率的なオプションはhttp://www.php.net/runkitで、長時間実行されている埋め込みPHPインスタンスとやりとりすることができます。

0

パーティーに遅いが、私は以下のPHP拡張に言及する必要があります。

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

は、runkit拡張子は定数、ユーザー定義関数、およびユーザー定義クラスを変更するための手段を提供します。また、カスタムの超大域変数と埋め込み可能なサブインタープリタをサンドボックス化によって提供します。

これにより、クラスを再定義することができます。これは、インクルードされたファイルの解析時に発生します。

注:私はこれを使用していません、特定のクラスを何らかの形でホットスワップすることができたかどうかを調べた後、私はそれを思いつきました。私は安全を保証することができず、実地の情報を提供することはできません。それでも。

関連する問題