2012-11-09 44 views
10

Tôi đang tạo một khung cơ bản trong PHP. Tôi cần chuyển dữ liệu cho trang hiện tại vào các chức năng khác nhau, cho phép họ sửa đổi và lưu nó, sau đó chuyển nó trở lại trang để hiển thị. Ban đầu tôi dự định lưu trữ dữ liệu trong một biến toàn cục như $GLOBALS['data'], nhưng tôi bắt đầu nghĩ rằng việc sử dụng toàn cầu là một ý tưởng tồi. Vì vậy, tôi nghĩ rằng thay vào đó tôi sẽ đặt một biến tĩnh trong lớp hệ thống, và truy cập nó bằng cách sử dụng system::$data. Vì vậy, câu hỏi của tôi là, sẽ tốt hơn và tại sao?Biến toàn cầu và biến tĩnh trong PHP

này:

$GLOBALS['data'] = array(); 
$GLOBALS['data']['page_title'] = 'Home'; 
echo $GLOBALS['data']['page_title']; 

Hoặc này:

class system 
{ 
    public static $data = array() 
} 

function data($new_var) 
{ 
    system::$data = array_merge(system::$data, $new_var); 
} 

data(array('page_title' => 'Home')); 
echo system::$data['page_title']; 

Trả lời

11

Thật sự không có sự khác biệt giữa một biến toàn cầu và một biến public static. Biến lớp được đặt tên một chút tốt hơn, nhưng điều đó hầu như không tạo ra bất kỳ sự khác biệt nào. Cả hai đều có thể truy cập bất cứ nơi nào bất cứ lúc nào và cả hai đều là trạng thái toàn cầu.

Vì nó xảy ra, tôi chỉ viết một bài báo đầy đủ về đề tài này:
How Not To Kill Your Testability Using Statics

+4

bài viết tuyệt vời –

+0

Có sự khác biệt về hiệu suất không? Dường như hình cầu không hiệu quả bằng cách sử dụng biến tĩnh. –

+2

@Kyle ** Nó không quan trọng. ** Nghiêm túc đấy. Có lẽ có một sự khác biệt, nhưng nó rất nhỏ về mặt thiên văn để không liên quan. Ưu tiên hàng đầu của bạn là viết mã có thể duy trì, hợp lý, có thể đọc được và tất cả các mã khác. Các biến số global và 'public static' đều là khủng khiếp cho mục đích này. – deceze

1

Vì vậy, câu hỏi của tôi là, đó sẽ là tốt hơn và tại sao?

Bạn đã biết rằng có một số vấn đề đặt tất cả điều này vào hình cầu. Mặc dù bạn đã phát triển một số suy nghĩ để đóng gói mọi thứ vào một lớp học.

Tôi nghĩ đó là điểm khởi đầu tốt. Hãy thêm chút gia vị vào nấu ăn để có được thông thạo hơn khi bắt đầu:

$data = new ArrayObject(array()); 
$data['page_title'] = 'Home'; 

Bây giờ bạn đã tạo một đối tượng để có thể truyền dữ liệu của bạn. Chỉ cần vượt qua $data đến khu vực cần thiết. Không cần biến tĩnh toàn cầu hoặc toàn cục.

Bạn thậm chí có thể làm cho loại đó cụ thể hơn sau này bằng cách kéo dài từ ArrayObject bằng loại của riêng bạn.

+0

Là một FYI, hoàn toàn không liên quan đến bài đăng này, chúng tôi không thể di chuyển câu hỏi cũ hơn 60 ngày nữa. – NullUserException

+0

@NullUserException: Cảm ơn bạn đã thông báo. – hakre