Có nên thường xuyên dùng Static trong OOP PHP

Câu hỏi của em giống như tiêu đề ạ, chẳng là em ms tìm hiểu PHP, em thấy có nhiều cách viết. Cho em hỏi là giữa Static và cách thông thường (Phải khai báo new class rồi từ class truy cập vào biến) thì cách viết nào mang lại hiệu suất tốt hơn, ít tốn tài nguyên hơn ạ. Em nên sử dụng cách nào, trong trường hợp nào ạ.

Tớ không nghĩ static variable với thuộc tính thông thường giống nhau về mặt sử dụng đâu. Static variable (a.k.a Class variable) được chia sẻ với mọi instance thuộc về class (instance nào cũng có thể access/modify giá trị của static variable). Thuộc tính thông thường thì được access thông qua thể hiện của class (instance), và chỉ instance đó mới có thể sửa được giá trị mà nó giữ.

Nếu cậu so sánh hiệu năng giữa method thông thường và static method, cậu có thể đạt được một tí xíu cải thiện về mặt hiệu năng nếu như sử dụng đúng cách (khi static method được load lên ngay khi class loader tải class của cậu lên, nên so với việc phải tạo thể hiện mỗi lần muốn truy cập vào thuộc tính, cậu sẽ có chút cải thiện). Cơ mà, hiệu năng cải thiện này được tính ở nanosec, nên tóm lại là chẳng có gì khác biệt về mặt hiệu năng cả.
Về mặt bộ nhớ, cậu cũng có thể chỉ tích góp được vài byte lẻ nếu dùng static method. Điều đó cũng coi như chẳng có gì khác biệt.

Generally, cậu không nên lạm dụng static và hi sinh maintainability. Đã có một topic giải thích về điều này trong quá khứ, tớ nghĩ cậu nên tham khảo:

5 Likes

Em cám ơn nhiều ạ. Em sẽ test và kiểm tra thêm các trường hợp ạ

mục đích sử dụng là khác nhau, nên không cần phải so sánh về hiệu năng và tối ưu
viết code thì viết cho đúng với mục đích của cái cú pháp đã sinh ra, chứ ai đâu rảnh rỗi sinh ra nhiều thứ vậy đâu

5 Likes

Anh nói rõ hơn cho em được k?

thuộc tính/phương thức tĩnh không phụ thuộc vào instance, không cần tạo instance cũng có thể gọi được

<?php
$servername = "localhost";
$username = "username";
$password = "password";

try {
  $conn = new PDO("mysql:host=$servername;dbname=myDB", $username, $password);
  // set the PDO error mode to exception
  $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  echo "Connected successfully";
} catch(PDOException $e) {
  echo "Connection failed: " . $e->getMessage();
}
?>

như đoạn code bên trên, PDO::ATTR_ERRMODE là một static attribute có value là int(3), thực tế bạn có thể điền số 3 vào đó chứ không cần phải viết dài dòng
vậy tại sao người ta lại phải viết dài như thế? bạn suy ngẫm thử xem

1 Like

Vâng ạ. Em cám ơn anh.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?