Tôi đang làm việc trên một dự án mà tôi muốn có thể khai báo một biến thành viên tĩnh bên trong một lớp cơ sở trừu tượng. Tôi đã có một lớp Model, một lớp bài trung gian, và cuối cùng là một bài viết lớp trang web cụ thể, giống như sau:Biến tĩnh PHP trong lớp trừu tượng
abstract class Model {
protected static $_table = null;
protected static $_database = null;
...
}
abstract class PostModel extends Model {
public function __construct() {
if (!isset(self::$_table)) {
self::$_table = 'some_table';
}
parent::__construct();
}
...
}
class SitePostModel extends PostModel {
public function __construct() {
if (!isset(self::$_database)) {
self::$_database = 'some_database';
}
parent::__construct();
}
...
}
Tôi muốn làm cho nó rõ ràng từ lớp Mẫu rằng $ _table và các thành viên $ _database là bắt buộc. Tuy nhiên, $ _table thực sự là tĩnh từ quan điểm của lớp PostModel, và $ _database thực sự là tĩnh từ quan điểm của lớp SitePostModel.
Đây có phải là cách hợp pháp để hoàn thành mục tiêu của tôi không? Việc khai báo các biến tĩnh trong Bản thân mô hình có ngụ ý rằng chúng chỉ tồn tại một lần cho lớp cơ sở trừu tượng, hay chỉ một lần cho lớp khởi tạo thực tế?
* (tham chiếu) * [chương về từ khóa 'static'] (http://php.net/manual/en/language.oop5.static.php) và [chương về Binding tĩnh muộn] (http : //php.net/manual/en/language.oop5.late-static-bindings.php). – Gordon
Đối với việc này là hợp pháp hay ngụ ý bất cứ điều gì, tôi muốn nói điều này là đối tượng tranh luận. IMO, bạn không nên sử dụng Thừa kế ở đây cả. Ngoài ra, Mô hình thường không ngụ ý cơ sở dữ liệu. – Gordon
Tôi đánh giá cao đầu vào @Gordon. Tôi nghĩ 'Mô hình không ngụ ý cơ sở dữ liệu' là đủ để thuyết phục tôi không đối xử với các thành viên theo cách này. Trong tương lai gần, lớp Model này sẽ chỉ mô hình hóa các bảng cơ sở dữ liệu, nhưng nó có thể không phải lúc nào cũng như vậy. – michaelxor