2011-01-24 12 views
5

Tôi đang làm việc trên một PHP IRC Bot, và tôi hiện đang làm việc trên các lệnh.có cách nào để "tách biệt" một tệp bằng PHP không?

Khi bắt đầu main.php, tập lệnh khởi động bot, nó bao gồm tệp class_lib.php và khởi tạo đối tượng của lớp đó. Tôi muốn làm việc trên một lệnh !reload, nơi nó sẽ "không bao gồm" tệp và sau đó bao gồm lại. Điều đó có thể được, hoặc nó sẽ là tốt nếu tôi chỉ include d nó một lần nữa khi lệnh đó đã được gửi?

EDIT: Về cơ bản, tôi muốn có thể sửa đổi và tải lại lớp mà không phải khởi động lại bot.

+0

Bạn nên giải thích những gì bạn đang cố gắng hoàn thành hoặc cụ thể hơn lý do tại sao. Bạn chỉ có thể phục hồi đối tượng bằng cách dỡ và tải lại định nghĩa lớp. – mario

+0

Sẽ tải lại tập lệnh? – Rob

+0

Tại sao một phiên bản "MyClass() mới" sẽ không hoạt động? – lepe

Trả lời

2

Tại sao không cho phép đối tượng tải lại cài đặt mặc định hoặc khởi động lại thay vì những gì bạn mô tả? Tôi chắc rằng bạn không thể làm điều đó.

Ngoài ra, đừng cố gắng tải đối tượng với class_lib.php. Bao gồm tệp lớp với đối tượng, sau đó ở đâu và khi nào bạn cần, hãy tạo đối tượng của bạn. Bằng cách đó bạn có thể ngăn chặn nó, phá hủy đối tượng, và sau đó tái khởi tạo một đối tượng khác, điều này sẽ hoàn thành những gì bạn muốn.

+0

Tôi không chắc chắn cách phá hủy đối tượng – Rob

+0

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

+0

Nếu bạn đang phá hủy một đối tượng đã tạo các kết nối cơ sở dữ liệu hoặc các loại hoạt động khác trong đó có các tài nguyên mở, bạn cũng nên tạo một $ objectvar- > destroy() function trong lớp đối tượng để tắt tất cả các tài nguyên, lưu bất cứ thứ gì cần được lưu và THEN unset ($ objectvar). –

1

Đừng sợ không có cách nào để loại trừ tệp. Nếu đó là một hàm, bạn có thể tạo một hàm mới một cách linh động mỗi lần.

Kiểm tra:

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

Bạn có thể gán một hàm cho một biến và sau đó rõ ràng rằng biến và gán cho nó một lần nữa.

4

Không, bạn không thể. Xem lại thiết kế của bạn. Đừng lặp lại định nghĩa của lớp với sự khởi tạo của đối tượng.

+0

OOAD là câu trả lời. – akond

+0

instantiation được thực hiện trong main.php, trong khi định nghĩa là trong class_lib.php. – Rob

+0

@akond, OOAD là gì? – Rob

1

Cuối câu trả lời ..

Bạn có thể tạo một mảng chứa các tập tin và sau đó eval (file_get_contents ($ filename))

Tôi đã làm việc trên máy khách IRC của riêng tôi đặt tên PITC và đó có thể là phương pháp tôi có thể sử dụng, Đó là cách tôi đã thực hiện các công cụ trước khi

+2

Oh điều kỳ diệu của 'eval'. Đó là cách mỉa mai. –

+0

bao gồm $ filename thực hiện chính xác điều tương tự. – AbiusX

0

Câu hỏi về bản chất là phát triển các plugin php có thể tải động trong php không gây nhiễu với các plugin khác hoặc mã chính.

Cách duy nhất tôi biết sẽ yêu cầu bạn thiết kế lại class_lib.php ban đầu và tạo lớp 'Plugin' hoạt động như lớp proxy sẽ thực hiện mọi cuộc gọi hàm/phương thức thực hiện một phiên bản php mới và chuyển đối số hàm với một cuộc gọi json_decode và sau đó lặp lại phản hồi với 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); 
} 

này sẽ phải được thực hiện cho tất cả các chức năng đơn/gọi phương thức thông qua một lớp proxy ... không phải như vậy hiệu quả, và nó sẽ không bao giờ làm việc cho các đối tượng/mảng kết hợp giữ tham chiếu đến các tài nguyên hoặc biến unserializable khác tài liệu tham khảo.

Một tùy chọn khác hiệu quả hơn là http://www.php.net/runkit cho phép bạn tương tác với một phiên bản chạy dài được nhúng trong php.

0

muộn để đảng, nhưng tôi phải đề cập đến PHP-phần mở rộng sau:

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

Việc gia hạn runkit cung cấp phương tiện để sửa đổi các hằng số, hàm do người dùng định nghĩa, và các lớp người dùng định nghĩa . Nó cũng cung cấp các biến superglobal tùy chỉnh và trình thông dịch phụ có thể nhúng thông qua hộp cát.

Điều này sẽ cho phép bạn xác định lại các lớp, diễn ra khi phân tích cú pháp các tệp được bao gồm.

LƯU Ý: Tôi đã không sử dụng điều này, tôi đã đến nó sau khi nghiên cứu nếu nó có thể bằng cách nào đó hotswap các lớp nhất định. Tôi không thể xác minh cho sự an toàn và không thể cung cấp thông tin thực hành. Chưa.

Các vấn đề liên quan