Hướng dẫn why not use static methods php? - tại sao không sử dụng phương thức tĩnh php?

Một phương pháp tĩnh chỉ là một hàm thông thường với một tên ưa thích (và truy cập bị hạn chế nếu nó không phải là public).

Phương pháp tĩnh không phải là OOP, chúng là mã thủ tục được ngụy trang.

Tôi có nên tránh sử dụng quá nhiều phương thức tĩnh trong PHP không?

Nó phụ thuộc vào số lượng bạn nghĩ là "quá nhiều". Đối với mã OOP thuần túy, một phương thức tĩnh đã "quá nhiều". Nhưng đôi khi không thể tránh khỏi (đọc "dễ dàng hơn") để viết một phương thức tĩnh cho một số chức năng.

Vì vậy, tôi tự hỏi nếu các phương thức tĩnh sẽ được tải vào bộ nhớ trước khi tôi sử dụng chúng.

Không có vấn đề nếu bạn chạy tập lệnh PHP bằng CLI hoặc nó được gọi qua máy chủ web để phục vụ trang web, văn bản của tập lệnh được tải vào bộ nhớ và được biên dịch. Nếu việc biên dịch thành công (nghĩa là không có lỗi cú pháp), trình thông dịch bắt đầu thực thi nó.

Tất cả mọi thứ được xác định trong tập lệnh đều có trong bộ nhớ tại thời điểm này, nhưng chỉ các mục được xác định trong tập lệnh chính. Các câu lệnh bao gồm (include, include_once, require,


$time = Time::from("11:45");
0) không được xử lý trong giai đoạn biên dịch.

Tệp được đề cập bởi câu lệnh include được tải trong bộ nhớ, được biên dịch và thực thi khi và nếu, câu lệnh include được đạt được trong quá trình thực thi tập lệnh. Toàn bộ nội dung của tệp được bao gồm được tải, phân tích cú pháp và chuyển đổi thành mã hóa, bất kể nó chứa các chức năng, lớp hoặc mã toàn cầu. Không có sự khác biệt giữa các phương thức thể hiện và phương pháp tĩnh từ quan điểm này.and if, the include statement is reached during the execution of the script. The entire content of the included file is loaded, parsed and converted to opcodes, no matter if it contains functions, classes or global code. There is no differences between instance methods and static methods from this point of view.

Máy dò lộn xộn PHP của tôi nói

Avoid using static access to class '\App\Models\Artist' in method 'getArtistId'.

Và các tài liệu giải thích rằng

Truy cập tĩnh gây ra sự phụ thuộc không thể thay đổi cho các lớp khác và dẫn đến khó kiểm tra mã. Tránh sử dụng truy cập tĩnh bằng mọi giá và thay vào đó là tiêm các phụ thuộc thông qua hàm tạo. Trường hợp duy nhất khi truy cập tĩnh được chấp nhận là khi được sử dụng cho các phương thức nhà máy.

Mặc dù vậy, tôi không hiểu tại sao, đặc biệt là khi rất nhiều tài liệu Laravel không làm điều này. Chẳng hạn, nếu tôi làm mô hình :: max ('id'), nó sẽ phá vỡ quy tắc này, nhưng tại sao sẽ tốt hơn để làm (mô hình mới)-> max ('id')?

Tôi đã hỏi các nhân viên đồng nghiệp của mình nếu chúng tôi có thể bỏ qua quy tắc này và họ không muốn bỏ qua nó, vì vậy tôi đang cố gắng hiểu tại sao đó là một quy tắc ngay từ đầu.

Hướng dẫn why not use static methods php? - tại sao không sử dụng phương thức tĩnh php?

Devin Dixon

Ngày 4 tháng 1 năm 2019

7 phút đọc

Bạn đã bao giờ đọc một cái gì đó về lập trình đã lỗi thời hoặc bị hiểu lầm và co rúm lại? Nhiều nhà phát triển PHP có thể có thể liên quan khi họ nghe thông tin sai lệch như là Py Python có quản lý gói tốt hơn, thì Php là một ngôn ngữ kịch bản chậm Rằng nhiều trong số những quan niệm sai lầm này được xếp hạng đầu tiên trên Google. Việc sử dụng tĩnh có cùng một

Huyền thoại đô thị và huyền thoại. Nó bắt đầu với ông già Noel khi chúng ta là trẻ em khi chúng ta trở thành người lớn và tin vào quy tắc 5 giây (một số độc giả sẽ chết bởi nó bất kể khoa học nói gì). Thần thoại cũng sinh sôi nảy nở thành lập trình, bao gồm các ngôn ngữ như PHP.

Một huyền thoại như vậy là các trích dẫn kép so với duy nhất về hiệu suất, đã được chứng minh nhiều lần

Một số phản ứng đối với bài đăng trên blog cuối cùng của tôi về các hàm tạo có tên trong PHP, bắt nguồn từ khái niệm rằng các phương thức tĩnh vốn đã xấu và không bao giờ nên được sử dụng. Điều này khá là quá mức.

Phương pháp tĩnh không có gì khác hơn là các chức năng toàn cầu theo tên. Theo tên, tôi nghĩ rằng tất cả chúng ta có thể đồng ý, là tuyệt vời. Đối với các chức năng toàn cầu: Chúng tôi sử dụng chúng mọi lúc. Các chức năng gốc trong PHP tạo thành các khối xây dựng cơ bản của chúng tôi.

Vấn đề cần xem xét là chia sẻ nhà nước toàn cầu. Ví dụ mà tôi đã đưa ra trong bài viết trước của mình, là minh bạch tham khảo:


$time = Time::from("11:45");

Nói cách khác, nó là không quốc tịch, nó không có tác dụng phụ, và như vậy, nó hoàn toàn có thể dự đoán được. Bạn có thể gọi chức năng chính xác giống nhau với cùng một đối số thường xuyên như bạn muốn, và bạn sẽ luôn nhận được kết quả chính xác tương tự (một trường hợp thời gian với giá trị 11:45), bất kể lịch sử của hệ thống, bất kể bối cảnh mà bạn gọi nó.

Một vi dụ khac:


$sum = Calculator::sum(1, 2); 

Một lần nữa, kết quả là có thể dự đoán được.


$time = Time::from("11:45");
3 cung cấp một dịch vụ không quốc tịch, điều đó không nhớ bất cứ điều gì, và kết quả của họ có thể bị ảnh hưởng bởi bất cứ điều gì khác ngoài các lập luận bạn đưa vào đó. Hơn nữa, dịch vụ này sẽ không bao giờ có đa hình hoặc có các triển khai khác nhau. Trả lại bất cứ điều gì 3 khác sẽ phá vỡ hợp đồng. Tất nhiên, bạn có thể đưa ra một thuật toán hiệu quả hơn để thêm vào các con số, nhưng điều đó sẽ không ảnh hưởng đến bất kỳ máy khách nào của máy tính.

Đối với một ví dụ, hãy để Lừa nhìn vào một dịch vụ trạng thái:


Counter::increment(1);
$count = Counter::getCount();

Đây tất nhiên là một ví dụ đơn giản, nhưng trong các tình huống phức tạp hơn, có thể khá mờ hơn khi hiểu được sự đầy đủ trạng thái này. Hãy tưởng tượng rằng một nhà phát triển sử dụng bộ đếm trong một phần của mã và một nhà phát triển khác sử dụng nó trong một phần khác. Cả hai đều kiểm tra mã của họ trong sự cô lập, và nó hoạt động tốt. Ngay khi các bộ phận được tích hợp, số lượng trở nên thất thường, bởi vì cả hai đều có chung trạng thái toàn cầu, thay vì mỗi bộ phận sở hữu một bộ đếm riêng. Giải pháp là có các đối tượng ở đây:


$myCounter = new Counter;
$myCounter->increment(1);
$count = $myCounter->getCount();

Trừu tượng

Bạn vẫn có thể cảm thấy sự kháng cự chống lại một cái gì đó như


$time = Time::from("11:45");
3, bởi vì nó không thể được mở rộng hoặc chế giễu. Tuy nhiên, hãy nhớ rằng chúng tôi đang ở mức độ trừu tượng thấp nhất ở đây. Bạn có thể mở rộng hoặc chế giễu toán tử + trong PHP. Tuy nhiên, bạn không bao giờ cảm thấy cần thiết cho điều đó. Nếu bạn cần mức độ trừu tượng cao hơn, thì bố cục là bạn của bạn. Thành phần OOP được biết đến, nhưng hãy để Lôi nhìn vào FP thực sự nhanh chóng. Trong PHP, có một sự khác biệt thú vị giữa

$time = Time::from("11:45");
5 và

$time = Time::from("11:45");
3: cái trước không thể được tiêm, cái sau có thể:


$result = array_reduce([1,2,3], 'Calculator::sum', 0);
// $result = 6

Bây giờ, tôi đang tham gia vào lĩnh vực lập trình bậc cao hơn, nhưng không có phạm vi, nhưng hãy để đồng ý rằng các chức năng và phương pháp tĩnh có thể rất hữu ích, với suy nghĩ đúng đắn.

Đọc thêm

  • Các hàm tạo được đặt tên trong PHP

  • Chia sẻ bài viết này trên Twitter hoặc LinkedIn
  • Theo dõi Mathias trên Twitter, LinkedIn hoặc sử dụng nguồn cấp dữ liệu Atom để cập nhật.

Tại sao bạn nên tránh các phương pháp tĩnh?

Tránh các phương pháp tĩnh vì chúng cho phép, ngụ ý và/hoặc khuyến khích truy cập nhà nước tư nhân toàn cầu. Nếu hàm/phương thức không yêu cầu trạng thái, thì không sử dụng phương thức tĩnh. Nếu phương pháp yêu cầu trạng thái, thì hãy đảm bảo rằng sự phức tạp được thêm vào là xứng đáng.they allow, imply and/or encourage global private state access. If the function/method does not require state, then do not use a static method. If the method does require state, then make sure that added complexity is worth it.

Tôi có nên sử dụng chức năng tĩnh PHP không?

Khi nào nên xác định phương pháp tĩnh?Từ khóa tĩnh được sử dụng trong bối cảnh của các biến và phương thức phổ biến cho tất cả các đối tượng của lớp.Do đó, bất kỳ logic nào có thể được chia sẻ giữa nhiều trường hợp của một lớp nên được trích xuất và đặt bên trong phương pháp tĩnh.The static keyword is used in the context of variables and methods that are common to all the objects of the class. Therefore, any logic which can be shared among multiple instances of a class should be extracted and put inside the static method.

Những nhược điểm của phương pháp tĩnh là gì?

Các hạn chế của các phương pháp tĩnh như sau:..
Phương thức tĩnh Chúng tôi không thể ghi đè (không thể ghi đè là không thể).
Chúng ta không thể sử dụng từ khóa 'này' bên trong phương thức tĩnh hoặc khu vực tĩnh vì đây là biến không được xác định trước ..
Trong phương pháp tĩnh, chúng tôi không thể sử dụng các thành viên dữ liệu không tĩnh ..

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

Nếu bạn có một khung, hãy sử dụng tính năng tiêm phụ thuộc của nó để làm điều đó.Bạn không nên sử dụng phương pháp tĩnh (trong OOP).Nếu bạn cần một phương thức tĩnh trong một trong lớp của mình, điều này có nghĩa là bạn có thể tạo một singleton/dịch vụ mới chứa phương thức này và đưa nó vào ví dụ của các lớp cần nó.If you need a static method in one of your class, this means you can create a new singleton/service containing this method and inject it to the instance of classes needing it.