Theo php, lớp :: tự luôn trỏ tới lớp chính nó, nhưng như tôi đã viết lại các mã này, một cái gì đó kỳ lạ xảy ra:Làm cách nào để 'tự' chính xác hoạt động trong các lớp được kế thừa?
class C_foo{
function foo() { return "foo() from C_foo"; }
function bar() { echo self::foo(); }
}
class C_bar extends C_foo{
function foo() { return "foo() from C_bar"; }
}
C_foo::bar();
C_bar::bar();
Tôi nghĩ kết quả sẽ là:
foo() from C_foo
foo() from C_bar
Nhưng trên thực tế:
foo() from C_foo
foo() from C_foo
Nó có nghĩa là tự trong tầng lớp phụ huynh kHÔNG chính xác kế thừa thành đứa trẻ, nó hoạt động giống như thế này:
foo() {return parent::foo();}
Đó có phải là một tính năng từ php hoặc là lỗi không? Hay là như thế này?
Nếu không, điều đó được xảy ra như tôi đã cố gắng để nói với một lớp tạo các đối tượng từ bản thân, mã này là một cái gì đó như thế này:
class Models {
function find($exp) {
...
...
$temp_model = new self();
...
...
}
}
class Something extends Models {...}
$somethings = Something::find("...");
Có lẽ ai đó sẽ hỏi, "tại sao bạn không thiết lập một biến với giá trị lớp và sử dụng biến làm hàm __construction? "
Như thế này:
...
...
function find($exp) {
...
...
$class_name = __class__;
$temp_model = new $class_name();
...
...
}
...
Trong thực tế, tôi đã làm điều đó, và có một kết quả thậm chí còn kỳ lạ hơn:
Nó chỉ hoạt động khi các lớp không có bất kỳ tài sản hoặc chức năng nhưng find()
, hoặc một lỗi cho tôi biết một biến cho thấy nơi một hàm sẽ tồn tại sẽ nhảy ra ngoài.
Cảm ơn rất nhiều, tôi sẽ cố gắng mô hình Nhà máy :) –