2012-08-14 34 views
5

Tôi muốn đánh giá ý kiến ​​của mọi người về việc sử dụng các lớp tĩnh thay vì không gian tên. Tôi đến từ một nền C++ và khá thích cú pháp của nó và cách nó cho phép bạn cấu trúc mã. Gần đây tôi đã quyết định tôi cần nhóm mã của mình thành các đơn vị logic thay vì chỉ các tệp. Ví dụ tôi thích các cuộc gọi như User :: login to user_login. Vì vậy, tôi đã làm một chút googling và đã được thuyên giảm để thấy rằng PHP có không gian tên. Việc cứu trợ của tôi không kéo dài lâu, tôi thực sự không thích cú pháp; nó làm tăng thêm sự lộn xộn cho các cuộc gọi hàm của tôi. Vì vậy, tại thời điểm này tôi đang sử dụng các lớp tĩnh để mô phỏng các không gian tên. Có bất kỳ nhược điểm nào đối với điều này không?Lớp tĩnh hoặc không gian tên PHP

Tôi đã tìm thấy câu hỏi tương tự tại PHP Namespaces vs Classes with static functions nhưng không có nhiều thảo luận.

Ngoài ra, có một cách để tránh những tình huống sau đây:

class Test { 
public static void myFunc() { 
    Test::myOtherFunc(); 
} 
public static void myOtherFunc() { 

} 
} 

tôi cho rằng nó sẽ là ok để gọi chức năng trong cùng một lớp mà không chỉ định tên, nhưng dường như không. Có cách giải quyết nào cho điều đó không (ví dụ trong C++ có từ khóa đang sử dụng).

+0

'self ::' và '$ this->' được sử dụng trong PHP để gọi các phương thức tĩnh và dụ của riêng bạn tương ứng. –

+0

Vì vậy, không có cách nào để trình độ chuyên môn tiềm ẩn? tức là để kiểm tra lớp hiện tại cho một hàm? – user1520427

+1

Không, nhưng tôi thấy rõ ràng là một điều tốt :) –

Trả lời

5

Thật trùng hợp tôi đã thực sự được chuyển sang hướng hoàn toàn ngược lại:

  1. Sử dụng không gian tên để tổ chức các lớp học miền (hoặc chức năng) dependency injection
  2. Sử dụng nơi tôi sẽ có cách khác sử dụng lớp tĩnh

Điều với các lớp tĩnh để mô phỏng không gian tên là bạn không thể sắp xếp chúng trên nhiều tệp, mọi thứ phải được xác định bên trong một tệp; điều này cũng có thể tùy thuộc vào sở thích cá nhân.

Điều khác về các lớp tĩnh là bạn bắt đầu không có trạng thái nào và từ từ một số creep quản lý trạng thái trong và bạn kết thúc với một số phụ thuộc khóa lạ. Nhà nước nên được dành riêng cho các trường hợp. Hiện tại, lớp tĩnh đáng chú ý duy nhất của tôi là cấu hình toàn trang.

Cuối cùng, tự tham chiếu trong các lớp tĩnh là rõ ràng, trong khi trong không gian tên nó hoạt động chính xác như C++ sẽ: bạn chỉ định tên hàm và nó được tra cứu bên trong vùng tên trước tiên.

+0

Tôi thích ý tưởng về không gian tên và cách chúng cho phép bạn quản lý mã, như bạn đã nói, bạn có thể sắp xếp chúng trên nhiều tệp. Nắm tay thực sự duy nhất của tôi là cú pháp clunky. Tôi không thấy cần sử dụng \ và xóa tính nhất quán với các ngôn ngữ khác. – user1520427

+0

@ user1520427 Tôi biết bạn cảm thấy thế nào, nó không phải là một người tìm kiếm tuyệt vời, nhưng nghĩ về nó như một cấu trúc thư mục và nó có ý nghĩa :) trình tự động tải mặc định thực sự sử dụng nó theo cách đó. –

4

Nếu bạn nhìn từ quan điểm của cấu trúc mã, không có sự khác biệt giữa phương pháp lớp tĩnh và hàm không gian tên. Cả hai đều kết thúc trong phạm vi toàn cầu. Chỉ có sự khác biệt là, với phương thức lớp tĩnh, bạn đang cố gắng giả mạo OOP.

Do đó, tốt hơn là nên sử dụng các hàm không gian tên, nếu những gì bạn thực sự cần là các hàm độc lập/tiện ích. Không gian tên dành cho việc nhóm (cả chức năng và các lớp).

Đối với bạn User::login() ví dụ, đó sẽ là một thực tiễn không tốt. Thay vào đó, bạn nên có một đối tượng thực sự, có khả năng chứa trạng thái.

$mapper = new UserMapper; 
$user = new User; 
$user->setNickname($name); 

$mapper->fetch($user); 

if ($user->hasPassword($password)) 
{ 
    $user->setLastLogin(time()); 
} 
else 
{ 
    // log the access attempt 
    // set error state 
} 

$mapper->save($user); 

Điểm mấu chốt là: nếu bạn đang sử dụng cấu trúc tĩnh (hàm hoặc phương pháp), nó không phải là OOP. Bạn chỉ là giả mạo nó. Thay vào đó, bạn nên sử dụng OOP thực, với dependency injection.

Nếu mã của bạn sử dụng các phương pháp và biến tĩnh trên toàn bộ địa điểm, nó sẽ tạo ra sự ghép nối chặt chẽ giữa các lớp, thêm global state và tạo harder to maintain and test codebase của bạn. Và đây không phải là PHP cụ thể.

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