2011-01-21 31 views
10

Tôi sử dụng để làm việc trong các ngôn ngữ như C#/Java/Python trong đó mỗi lớp sẽ có tập tin riêng của mình, và cho một lớp để xem các lớp khác, bạn sẽ nhập khẩu gói chứa những lớp học. Cách này hoạt động trong php? Tài liệu hướng dẫn cho bạn thấy cách tạo các lớp, nhưng tôi không hiểu làm thế nào nó phù hợp với nhau trong một ngữ cảnh php. Tôi biết về tuyên bố bao gồm, mà chỉ dính các tập tin với nhau về cơ bản.php oop - mỗi tệp lớp khác nhau? gói nhập? vv

+3

bản sao có thể có của [Nhập gói hoặc tự động tải cho PHP?] (Http://stackoverflow.com/questions/616231/import-package-or-autoloading-for-php) – Gordon

+2

* (tipp) * tìm kiếm tự động tải và quy tắc mã trong PHP – Gordon

+0

Cá nhân, tôi thấy rất hợp lý khi có từng lớp trong tệp riêng của nó ... nhưng sử dụng trình nạp tự động thay vì nhập khẩu –

Trả lời

15

Bạn có thể sử dụng __autoload

function __autoload($class_name) { 
    include 'classes/'.$class_name . '.php'; 
} 

Vì vậy, đặt mỗi lớp duy nhất trong tập tin riêng của mình trong thư mục lớp học. Khi bạn muốn sử dụng lớp đó, nó sẽ bao gồm nó. Thông tin thêm: http://php.net/manual/en/language.oop5.autoload.php

Cập nhật: Khi tôi trả lời câu hỏi này hoàn toàn hợp lệ. Bây giờ nó vẫn hoạt động, nhưng hãy ghi nhớ PHP.net kể từ đó nói điều này:

spl_autoload_register() cung cấp một sự thay thế linh hoạt hơn cho các lớp tự động nạp . Vì lý do này, việc sử dụng __autoload() là không được khuyến khích và có thể bị phản đối hoặc bị xóa trong tương lai.

+2

+1 để bao gồm liên kết tham chiếu –

+2

Ngoài ra, hãy tham khảo nhìn vào: http://www.php.net/manual/en/function.spl-autoload-register.php – Mchl

0

Hãy tưởng tượng bạn đã làm cho đối tượng của bạn bằng PHP trong một tập tin gọi là myObject.php

<?php 

    class myObject 
    { 
    public function __construct() 
    { 
     echo "Hello, World"; 
    } 
    } 

?> 

Và trong tập tin khác, bạn muốn sử dụng các đối tượng (chúng ta hãy gọi myfile.php này). Bạn sẽ phải bao gồm đối tượng của mình - như sau:

<?php 

    include("myObject.php"); 

    $intance = new myObject(); 

?> 

Khá đơn giản.

+3

Cho đến khi bạn cần quản lý danh sách bao gồm dài hơn mã của bạn. – Mchl

+0

@Mchl: Ồ thật dễ dàng, hãy đặt các tệp bao gồm trong tệp của riêng mình và bao gồm: P – BoltClock

+0

@BoltClock: đã ở đó, thực hiện: D – Mchl

0

Trong PHP, bạn có thể thực hiện theo nhiều cách khác nhau, trình biên dịch không giới hạn bạn.

Bạn có thể có 1 lớp trong 1 file, 5 lớp trong 1 file, 1 lớp trên một số file sử dụng bao gồm ...

Nhưng thường nó vẫn còn 1 lớp trong 1 file, và nếu bạn có nhiều những người tí hon - bạn cũng có thể có chúng trong 1 thư mục.

Khi thực hiện 1 lớp trong 1 tệp có cùng tên, bạn có thể thiết lập tự động tải lớp để bạn không cần phải viết bao gồm của mình.

+0

Bạn KHÔNG thể chia lớp cho nhiều tệp. Xem ở đây ví dụ: http://stackoverflow.com/questions/1957732/can-i-include-code-into-a-php-class/1957830#1957830 – yokmp

4

Cách đơn giản nhất:

  • xác định các lớp học của bạn trong "lớp học" thư mục ứng dụng
  • init như hình dưới đây
  • tên tập tin tên lớp như tên lớp thường của họ với .php hậu tố (MyClass = > classes/myclass.php)

Init code:

set_include_path ("./classes"); 
spl_autoload_register(); 

//class is automatically loaded from ./classes/myclass.php 
$object_instance = new MyClass(); 
2

Kể từ PHP 5.3.0, bạn nên sử dụng hàm spl_autoload_register() vì __autoload() được cho là không dùng nữa trong tương lai.

Một cách dễ dàng để sử dụng chức năng này:

1) Đặt mỗi tập tin lớp vào thư mục 'lớp'

2) Chạy một chức năng ẩn danh bên spl_autoload_register() mà xác định thư mục lớp học của bạn:

spl_autoload_register(function ($class) { 
    include 'classes/' . $class . '.php'; 
}); 

Bây giờ khi bạn cố gắng sử dụng một lớp chưa được xác định trong mã của bạn, nó sẽ kiểm tra thư mục lớp đó lần cuối trước khi bạn gặp lỗi.

+0

Điều này là tuyệt vời nhưng điều này được sử dụng tốt nhất khi bạn muốn trình nạp tự động của riêng bạn với tên riêng của nó như được mô tả trong Ví dụ # 1 ở đây: http://php.net/manual/en/function.spl-autoload-register.php Trong trường hợp này __autoload là đủ. –

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