Tôi đang làm việc trên một giải pháp ORM đơn giản và đã gặp phải một tình huống khó khăn. Lý tưởng nhất, tôi muốn có thể sử dụng các phương thức trong cả ngữ cảnh tĩnh và bối cảnh đối tượng tùy thuộc vào cách nó được gọi. Tôi không chắc chắn nếu điều này là có thể, nhưng đây là những gì tôi muốn nói:Phương pháp tĩnh/không tĩnh Vấn đề
Nói một mô hình Người dùng muốn gọi nơi() tĩnh, điều này hiện đang hoạt động tốt, ví dụ:
$user = User::where('id = ?', 3);
Bây giờ, tôi cũng hỗ trợ các mối quan hệ, ví dụ như một người dùng có thể có tin nhắn. Khi mối quan hệ này được thiết lập, tôi chỉ cần lưu trữ một bản sao trống của một mô hình tin nhắn trong mô hình người dùng và thiết lập một khóa ngoại. Ví dụ:
$user -> messages = new Message();
$user -> messages -> foreign_key = 'user_id';
Bây giờ, lý tưởng, tôi muốn để có thể gọi:
$user -> messages -> where('unread = ?', 1);
Trong một bối cảnh không tĩnh và tận dụng $ this -> foreign_key khi trong bối cảnh này nên chỉ để kéo tin nhắn trong đó khóa ngoại khớp với id của người dùng. Đây có phải là loại chuyển đổi ngữ cảnh có thể có trong PHP không? Bất kỳ tham chiếu đến $ này từ ngữ cảnh tĩnh ném lỗi như một phương thức tĩnh và không nên dựa vào $ this (vì lý do hiển nhiên, khi được gọi từ ngữ cảnh tĩnh, $ this sẽ không tồn tại)
Có bất kỳ cách thông minh xung quanh điều này? Tôi đã cố gắng quá tải phương pháp để có hai nguyên mẫu khác nhau, cả hai có và không có từ khóa tĩnh nhưng điều này đã ném một lỗi khai báo lại.
$ user = Người dùng :: find(); bạn muốn điều này trả lại nếu nó không chỉ định khóa ngoại? – craig1231
Nó có vẻ như trong sử dụng hàng đầu, 'find()' là một hàm (tĩnh) trong lớp 'User', nhưng ở phía dưới,' find() 'là một phương thức trong lớp' Message'. Đó là cái nào? Cả hai? – jedwards
Có lẽ đó là một ví dụ không rõ ràng, tôi đã bỏ qua các tham số vì chúng dường như không liên quan đến câu hỏi nhưng tôi sẽ làm rõ nó bằng cách trình bày chính xác hơn về cách nó thực sự hoạt động. –