Bắt đầu với phiên bản 5.3, PHP hỗ trợ late binding cho các phương pháp tĩnh. Mặc dù đây là một tính năng hữu ích nhưng chắc chắn chỉ có một vài trường hợp việc sử dụng nó thực sự cần thiết (ví dụ: mẫu Bản ghi hoạt động).Có thể sử dụng quá nhiều ràng buộc tĩnh muộn trong PHP không?
Hãy xem xét các ví dụ:
1. constructors Thuận tiện (::create()
)
class SimpleObject
{
public function __construct() { /* ... */ }
public static function create()
{
return new static; // or: return new self;
}
}
Nếu lớp này có thể kéo dài (tuy nhiên, nó không được gia hạn bởi bất kỳ lớp trong cùng một gói), nên liên kết tĩnh muộn được sử dụng chỉ để làm cho việc mở rộng dễ dàng hơn (mà không phải viết lại phương thức ::create()
, và quan trọng hơn, mà không cần phải nhớ để làm điều đó)?
Lưu ý: thành ngữ này được sử dụng để làm việc xung quanh khả năng không thể gọi các phương thức trên đối tượng vừa được xây dựng: new SimpleObject()->doStuff()
không hợp lệ trong PHP.
2. Lớp hằng
class TagMatcher
{
const TAG_PATTERN = '/\<([a-z\-]+?)\>/i';
private $subject;
public function construct($subject) { $this->subject = $subject; }
public function getAllTags()
{
$pattern = static::TAG_PATTERN;
preg_match_all($pattern, $this->subject);
return $pattern[1];
}
}
Lý do để sử dụng static::
trong ví dụ này là tương tự như trước đó. Nó được sử dụng chỉ vì lớp này có thể được thực hiện để phù hợp với các thẻ được tạo khác nhau chỉ bằng cách mở rộng nó và ghi đè hằng số.
Vì vậy, để kết thúc tất cả, những công dụng này (và những thứ tương tự) của liên kết tĩnh trễ có quá mức không? Có hiệu suất đáng chú ý nào không? Ngoài ra, không thường xuyên sử dụng các ràng buộc muộn làm giảm hiệu suất tổng thể tăng được đưa ra bởi bộ đệm opcode?
Vâng, điều thứ hai có thể đạt được bằng cách ghi đè biến riêng và sử dụng '$ this', đúng không? Hay tôi hiểu nhầm điều gì đó? – Franz
Có, nhưng tôi chỉ không thể đưa ra một ví dụ tốt hơn ... Có nó như là một 'const' có nghĩa là tránh sao chép nó thông qua tất cả các trường hợp. Và ngay cả khi copy-on-write của PHP sẽ tối ưu hóa điều này, nó chắc chắn sẽ tốt hơn như là một hằng số lớp, bởi vì nó thực sự là một giá trị không đổi toàn lớp. –
... và tất cả điều đó, tôi thực sự có nghĩa rằng trong trường hợp này, sử dụng các biến mẫu trông giống như một giải pháp thay thế, trong khi 'static ::' thì không. –