2011-02-03 36 views
9

Đây có phải là một thực tế không tốt?PHP - xác định các lớp bên trong một hàm

thích:

function boo(){ 
    require_once("class.moo.php"); 
} 
... 

?

+0

Bản sao có thể có của [# 2619573] (http://stackoverflow.com/questions/2619573/how-to-use-include-within-a-function) – drudge

+0

Tôi nghĩ rằng đó là sự lừa đảo của [this] (http: //stackoverflow.com/questions/1669707/should-require-once-some-file-php-appear-anywhere-but-the-top-of-the-file) thực sự là – greatwolf

Trả lời

7

thực tiễn không tốt; no không.

Bạn đang có khả năng sẽ nhận được cả hai câu trả lời, và đây là lý do:

Nếu bạn sử dụng __autoload (hoặc tương đương), gọi số:

function someFunc() 
{ 
    $n = new UndefinedClassName(); 
} 

tương đương với:

function someFunc() 
{ 
    include('path/to/UndefinedClassName.php'); 
    //may be require_once, include_once, include, or require 
    //depending on how autoload is written 
    $n = new UndefinedClassName(); 
} 

Nhưng bạn sẽ nhận được hiệu suất tốt hơn trong mã của mình nếu bạn tránh sử dụng __autoload. Và để duy trì mã của bạn, tốt hơn bạn nên đặt tất cả includes ở đầu tập lệnh như bạn muốn cho các câu lệnh import bằng các ngôn ngữ khác.

include('path/to/UndefinedClassName.php'); 
...code... 
function someFunc() 
{ 
    $n = new UndefinedClassName(); 
} 

Tôi khuyên bạn nên nhất quán. Nếu bạn liên tục gọi tới số include trong các hàm, bạn không nên có quá nhiều vấn đề, nhưng tôi sẽ chọn nhập tại thời điểm bắt đầu của tệp hoặc dưới dạng autoloads.

3

Tôi sẽ tránh điều đó.

Đây không phải là điều mà một nhà phát triển khác mong đợi và, như vậy, sẽ làm giảm khả năng bảo trì mã của bạn.

+2

"đó không phải là điều mà một nhà phát triển khác mong đợi" trừ khi tất nhiên nhà phát triển khác cũng đang làm điều tương tự ... – zzzzBov

+0

@zzzzBov: Tất nhiên, ý tôi là một nhà phát triển "bình thường". Thực hành phi tiêu chuẩn là thực hành không tốt, IMO. –

+1

tôi đồng ý với những gì bạn đang nói ở một số cấp độ, nhưng điều quan trọng là phải phân biệt * tiêu chuẩn mà bạn đang nói đến. Không có tiêu chuẩn * chính thức *, chỉ có cách các lập trình viên khác đã viết mã trong quá khứ. Điều gần nhất với tiêu chuẩn * chính thức * là đặc tả và cú pháp mã hóa, điều này là tự do vì một lý do. – zzzzBov

1

Đây là cách trình nạp lớp hoạt động. Đây không nhất thiết phải là thực hành xấu.

Phụ thuộc vào chức năng và lý do bạn làm việc này. Sử dụng autoloading có thể phù hợp hơn.

0

Nếu bạn có lý do cho điều này, tôi không thấy bất cứ điều gì xấu về nó.

1

Điều này thường là hành vi không tốt và nên tránh. Có lẽ bạn nên cân nhắc sử dụng một số autoloader.

+0

Như đã nói ở nơi khác, về cơ bản cách trình nạp tự động hoạt động. – Mchl

+0

Có, nhưng trình nạp tự động không có cùng các vấn đề về khả năng đọc/bảo trì. – keithjgrant

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