Tại sao không có cơ sở để quá tải các thuộc tính tĩnh trong PHP?


13

Giới thiệu

PHP cho phép bạn quá tải các cuộc gọi phương thức và truy cập thuộc tính bằng cách khai báo các phương thức ma thuật trong các lớp. Điều này cho phép mã như:

class Foo {
    public function __get($name) { return 42; }
}

$foo = new Foo;
echo $foo->missingProperty; // prints "42"

Ngoài việc nạp chồng các thuộc tính và phương thức cá thể, vì PHP 5.3.0, chúng ta cũng có thể nạp chồng staticcác phương thức gọi bằng cách ghi đè phương thức ma thuật __callStatic.

Một cái gì đó mất tích

Điều còn thiếu rõ ràng từ chức năng có sẵn là khả năng quá tải các thuộc tính tĩnh , ví dụ:

echo Foo::$missingProperty; // fatal error: access to undeclared static property

Hạn chế này rõ ràng là tài liệu :

Quá tải tài sản chỉ hoạt động trong bối cảnh đối tượng. Những phương thức ma thuật này sẽ không được kích hoạt trong bối cảnh tĩnh. Do đó, các phương pháp này không nên được khai báo static. Kể từ PHP 5.3.0, một cảnh báo được đưa ra nếu một trong những phương thức nạp chồng ma thuật được khai báo static.

Nhưng tại sao?

Câu hỏi của tôi là:

  1. Có một lý do kỹ thuật mà chức năng này hiện không được hỗ trợ? Hoặc có lẽ là một lý do chính trị (rùng mình)?
  2. Đã có bất kỳ nỗ lực bị hủy bỏ để thêm chức năng này trong quá khứ?

Quan trọng nhất, câu hỏi không phải là "làm thế nào tôi có thể có các thuộc tính tĩnh động trong PHP của người dùng?". Điều đó nói rằng, nếu bạn biết về một triển khai đặc biệt dễ thương dựa trên __callStaticđiều bạn muốn chia sẻ thì bằng mọi cách hãy làm như vậy.

Câu trả lời:


11

Trích dẫn http://marc.info/?l=php-iternals&m=121578194822276&w=2

Là quá tải thành viên tĩnh được thêm vào trong PHP 5.3? Tôi nhận thấy rằng quá tải phương thức tĩnh là (__callStatic). Cả hai sẽ bổ sung cho nhau và dường như cũng tự nhiên để thêm những thứ này. Tôi đã nhận thấy rằng chúng nằm ngoài RFC "lớp tĩnh" và một báo cáo lỗi, nhưng thật tuyệt khi thấy những điều này trong 5.3. Với sự bổ sung và LSB này, các lớp php có thể làm rất nhiều! Ví dụ:

__setStatic()
__getStatic()
__issetStatic()
__unsetStatic()

Trích dẫn theo dõi http://marc.info/?l=php-iternals&m=121578318524848&w=2

nếu RFC cho các lớp tĩnh sẽ được chấp nhận, các bộ chặn thuộc tính tĩnh sẽ là một phần của phiên bản chính tiếp theo của PHP (có thể là 5,4 hoặc 6). Vì vậy, nó sẽ không được đưa vào 5.3, nhưng chúng ta sẽ có hy vọng đó trong tương lai.

Liên kết với các lớp tĩnh RFC:

Trạng thái của RFC là "đang hoạt động" nhưng cho rằng đó là từ năm 2008, bạn có thể muốn hỏi trên danh sách gửi thư của php.iternals hoặc trên # php.pecl trên EFNet IRC để tìm hiểu điều gì đã xảy ra.


Cảm ơn, Gordon, rất hữu ích, như thường lệ. ;-) Mặc dù các lớp tĩnh RFC dường như đề xuất hỗ trợ cho __getStatic()__setStatic()trên các lớp tĩnh , nhưng vẫn có ích khi có chức năng này cho các lớp khả thi. Bạn có biết bất kỳ động thái theo hướng này?
David Weinraub

@DavidWeinraub không, xin lỗi. Tbh, tôi không quan tâm đến những thứ liên quan đến phương pháp tĩnh. Tôi gần như không bao giờ tìm thấy bất kỳ sử dụng tốt cho họ và họ dẫn đến khớp nối xấu và thử nghiệm đau đớn.
Gordon

Hoàn toàn đồng ý! ;-) Nhưng một số khung công tác thúc đẩy tôi sử dụng statics cho lớp mô hình của chúng. __getStatic()sẽ cho phép tôi DRY lên rất nhiều mã hiện có của tôi. Cảm ơn!
David Weinraub
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.