2010-09-21 13 views
6

Tôi có một thông dịch viên lệnh trong php. Nó nằm bên trong thư mục lệnh và cần truy cập vào mọi lệnh trong tệp lệnh. Hiện tại tôi gọi yêu cầu một lần trên mỗi lệnh.Bao gồm toàn bộ thư mục trong PHP hoặc Wildcard để sử dụng trong PHP Bao gồm?

require_once('CommandA.php'); 
require_once('CommandB.php'); 
require_once('CommandC.php'); 

class Interpreter { 
    // Interprets input and calls the required commands. 
} 

Có cách nào khác để bao gồm tất cả các lệnh này với một yêu cầu duy nhất không? Tôi có một vấn đề tương tự như nhiều nơi khác trong mã của tôi (với các nhà máy, nhà xây dựng, thông dịch viên khác). Không có gì ngoài các lệnh trong thư mục này và trình thông dịch cần mọi tệp khác trong thư mục. Có một ký tự đại diện có thể được sử dụng theo yêu cầu không? Chẳng hạn như:

require_once('*.php'); 

class Interpreter { //etc } 

Có cách nào khác xung quanh vấn đề này không bao gồm hai mươi dòng bao gồm ở đầu tệp không?

Trả lời

4

Tại sao bạn muốn làm điều đó? Nó không phải là một giải pháp tốt hơn để chỉ bao gồm các thư viện khi cần nó để tăng tốc độ và giảm dấu chân?

Something như thế này:

Class Interpreter 
{ 
    public function __construct($command = null) 
    { 
     $file = 'Command'.$command.'.php'; 

     if (!file_exists($file) { 
      throw new Exception('Invalid command passed to constructor'); 
     } 
     include_once $file; 

     // do whatever else you want here. 
    } 
} 
+0

Đẫm máu rực rỡ. Sẽ không nghĩ về điều đó - đúng là ngu ngốc với tôi, vì cấu trúc tên và thư mục của tôi đã được thiết lập để làm chính xác điều này. Tôi sẽ không nghĩ đến điều kiện bao gồm cả. Đoán đó là suy nghĩ C cũ của tôi khiến tôi gặp rắc rối một lần nữa ... –

+8

Một giải pháp [autoload] (http://de.php.net/manual/en/function.spl-autoload-register.php) sẽ có phần thanh lịch hơn. – Gordon

+0

Tôi đồng ý, nhưng chỉ khi mã bên trong mỗi Lệnh .php là định hướng đối tượng. – thomasmalt

2

Bạn có thể bao gồm tất cả các tệp bằng cách sử dụng foreach()
Lưu trữ tất cả tên tệp trong mảng.

$array = array('read','test'); 

foreach ($array as $value) { 
    include_once $value.".php"; 
} 
17
foreach (glob("*.php") as $filename) { 
    require_once $filename; 
} 

tôi phải cẩn thận với cái gì đó như mặc dù điều đó và luôn thích "bằng tay" bao gồm các file. Nếu đó là quá nặng nề, có lẽ một số refactoring là theo thứ tự. Một giải pháp khác có thể là autoload classes.

+0

Nguy hiểm khi thực hiện điều gì đó giống như hình cầu trên? –

+1

@Daniel: Có nhiều khả năng bạn sẽ cần rất nhiều nguồn sẽ không được sử dụng. – fabrik

+5

Nó mở ra cho bạn các lỗ hổng bảo mật nếu ai đó có thể đặt một tệp .php trong một trong các thư mục bao gồm, có thể thông qua khai thác lỗ hổng khác ở đâu đó. Nó cũng làm cho nó khó khăn hơn để theo dõi những gì được bao gồm ở đâu. – deceze

7

Bạn không thể require_once một ký tự đại diện, nhưng bạn có thể lập trình tìm tất cả các file trong thư mục đó và sau đó yêu cầu họ trong một vòng lặp

foreach (glob("*.php") as $filename) { 
    require_once($filename) ; 
} 

http://php.net/glob

+1

+1 giải thích, liên kết đến TFM, thực sự trả lời câu hỏi –

0

Đó là 2015 ngay, vì vậy bạn rất có thể chạy PHP> = 5. Nếu vậy, như đã đề cập một vài lần ở trên, khả năng tự động load PHP là một giải pháp tốt, có lẽ là tốt nhất. Nó được tạo ra đặc biệt, do đó bạn sẽ không phải viết một hàm tiện ích để tải tự động. Tuy nhiên, như đã đề cập trong tài liệu PHP, __autoload không còn khuyến nghị và có thể bị khấu hao trong các phiên bản sau này. Miễn là bạn đang sử dụng PHP> = 5.1.2, thay vào đó hãy sử dụng spl_autoload_register.