Khi nào nên sử dụng các phương thức tĩnh PHP

Hãy để tôi cố gắng thuyết phục bạn tại sao trạng thái chia sẻ là sai và cách tránh nó để trở thành một nhà phát triển tốt hơn

The “stop” road sign with Sun behind it

Ảnh của Anwaar Ali trên Bapt

Trong ấn phẩm trước của tôi, tôi đã cố gắng thuyết phục bạn ngừng sử dụng từ khóa “extends” trong PHP. Hôm nay tôi có một số lời khuyên cho bạn về trạng thái được chia sẻ khi sử dụng “tĩnh”. Nhớ. chỉ vì bạn có thể, không có nghĩa là bạn nên

tl; dr không có ưu điểm, chỉ có khuyết điểm. Mã được thiết kế phù hợp không cần bất kỳ phương thức tĩnh hoặc thuộc tính tĩnh nào. Đóng tĩnh và phương pháp nhà máy tĩnh là hoàn toàn tốt

Ngừng sử dụng “extends” trong PHP

Bạn có sử dụng các lớp trừu tượng hoặc các lớp mở rộng trong mã miền của mình không?

Blog. thiên tài. io

Khi đề cập đến tĩnh tại thời điểm viết, có ba khả năng. Chúng tôi sẽ xem xét tất cả chúng và thảo luận về lý do tại sao chúng thường được sử dụng và cách tránh chúng

Phương pháp lớp tĩnh

Các phương thức lớp tĩnh chủ yếu được sử dụng để dễ dàng gọi một lớp từ một lớp khác. Ban đầu có thể rất hấp dẫn để làm như vậy, nhưng cuối cùng, nó dẫn đến những quyết định thất thường như gửi e-mail từ đối tượng người dùng. Kết quả cuối cùng luôn giống nhau. một mớ hỗn độn

A mess: lots of cables hanging on a pole

Ảnh của Ralph (Ravi) Kayden trên Bapt

Nhược điểm

  • thúc đẩy thói quen xấu vượt qua ranh giới giữa các lớp không nên trộn lẫn (lớp cơ sở hạ tầng trong lớp miền)
  • kiểm tra đơn vị khó hoặc tẻ nhạt (không thể dễ dàng giả định các phụ thuộc)

Thay vì sử dụng các phương thức tĩnh, hãy sử dụng phép nội xạ phụ thuộc. Trên thực tế, mọi khung hiện đại đều cung cấp cho bạn tính năng tiêm phụ thuộc vượt trội. Xóa từ khóa tĩnh khỏi phương thức và thêm lớp vào hàm tạo

Thuộc tính lớp tĩnh

Thuộc tính lớp tĩnh chủ yếu được sử dụng để áp dụng mẫu ghi nhớ để áp dụng tối ưu hóa vi mô. Kỹ thuật bộ nhớ đệm đơn giản này có thể cải thiện hiệu suất bằng cách giữ dữ liệu được truy cập thường xuyên gần với quá trình triển khai. Phương pháp này không phản tác dụng trong PHP, bởi vì quá trình này chỉ tồn tại trong yêu cầu HTTP và sau đó nội dung sẽ nhanh chóng được giải phóng

Chúng cũng được sử dụng để áp dụng mẫu singleton, một trong những mẫu tồi tệ nhất đang lưu hành trong ngành, vì những lý do đã nêu ở trên đối với các phương thức lớp tĩnh

Mọi thứ trở nên phức tạp khi chúng ta bắt đầu chuyển mã sang các quy trình chạy dài như lệnh cron, queue worker hoặc khi chuyển sang async PHP như Swoole. Nếu dữ liệu không được giải phóng đúng cách, bạn có thể gặp phải tình trạng rò rỉ bộ nhớ khi tăng mức sử dụng RAM và ứng dụng sẽ chết do lỗi hết bộ nhớ

Nhược điểm

  • nếu không được xử lý cẩn thận có thể dẫn đến rò rỉ mã (trong trường hợp các quy trình chạy lâu)
  • kiểm tra đơn vị rất tẻ nhạt (lập trình viên phải xóa nội dung của các thuộc tính tĩnh giữa các lần chạy để tránh lỗi do dữ liệu chồng chéo trong kiểm tra)
  • trong trường hợp xử lý song song, bộ nhớ cache được sử dụng cho mỗi quy trình làm tăng mức sử dụng RAM một cách không cần thiết

Thay vào đó, bạn nên thêm bộ điều hợp bộ đệm bằng cách sử dụng tính năng tiêm phụ thuộc trong khung của mình và đảm bảo rằng Thời gian tồn tại được đặt cho từng mục để cuối cùng cho phép xóa bộ đệm

biến tĩnh

Tôi chưa bao giờ sử dụng chúng, nhưng tôi đã thấy chúng được sử dụng để lưu trữ dữ liệu vào bộ đệm hoặc để giảm mức sử dụng bộ nhớ bằng cách giữ lại các dịch vụ có thể sử dụng lại như ứng dụng khách HTTP

Nhược điểm của việc sử dụng các biến tĩnh hoàn toàn giống như đối với các thuộc tính của lớp tĩnh và một lần nữa, không có ưu điểm nào

Thay vì giữ một thuộc tính tĩnh, bạn nên thêm phần phụ thuộc vào hàm tạo

Kịch bản hợp lệ cho mã tĩnh

Có một số kịch bản hoàn toàn tốt cho mã tĩnh. Chúng bao gồm

đóng cửa bất biến

$userList = $collection->map(static function(User $user): array {
return [
'id' => $user->getId(),
'username' => $user->getUsername(),
];
});

Phương pháp nhà máy bất biến

final class UserNotFoundException extends \DomainException
{
public static function byId(int $id): self {
return new self(\sprintf('User by id %d not found', $id));
}
}

Phương pháp bất biến riêng tư

public function getPrintableName(): string
{
return \sprintf(
'%s: %s',
self::cleanEmoji($this->title),
self::cleanEmoji($this->subtitle),
);
}
private static function cleanEmoji(string $input): string
{
// do the work
}

Sau khi bạn thoát khỏi trạng thái chia sẻ, việc triển khai mã của bạn trên đám mây sẽ dễ dàng hơn nhiều. Tránh các phương thức tĩnh thúc đẩy thói quen tốt và làm cho mã của bạn ít bị rối hơn và dễ kiểm tra hơn

Trong hàng ngàn hàng vạn dòng code mà tôi phải duy trì trong công việc chuyên môn của mình, tôi thấy không có lý do gì để sử dụng mã tĩnh, không có lý do gì để bạn làm như vậy. Hãy tự hỏi bản thân bạn đã sẵn sàng để trở thành một nhà phát triển tốt hơn chưa? . Bạn sẽ cảm ơn tôi sau này

Bất kỳ nghi ngờ? . Hãy cùng nhau làm cho mã của chúng tôi đẹp. Đăng ký các ấn phẩm của tôi để biết thêm các bài viết như thế này để trở thành một nhà phát triển tốt hơn

Câu chuyện này có giá trị gì với bạn không? . Bạn có biết rằng bạn có thể vỗ tay nhiều hơn một lần?