2012-04-12 31 views
9

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.

Trả lời

-3

Trong PHP, các lớp không phải là đối tượng. Do đó, không có kế thừa các phương thức tĩnh (thực ra, chúng tương tự như các hàm toàn cầu).

Vì vậy, khi C_foo tự nói, điều đó luôn có nghĩa là C_foo (ngay cả khi bạn gọi phương thức từ C_bar).

Nếu bạn muốn tạo cá thể từ phương thức lớp trừu tượng, bạn nên thử mẫu Nhà máy.

+0

Cảm ơn rất nhiều, tôi sẽ cố gắng mô hình Nhà máy :) –

1

Điều này là do lớp nhận được các phương thức của cấp độ gốc là của lớp đó. Vì vậy:

$ bar là Bar, do đó, tự :: đề cập đến Bar, không phải Foo. Mặc dù phương pháp đó là từ Foo.

Điều này có thể khác với Java, nhưng nó có thể chỉ ra cách thức PHP đang thực hiện kế thừa nội bộ.

+0

Tôi bây giờ cố gắng thay đổi mã của tôi, và có thể là tôi thực sự cần phải đi sâu hơn vào này ngôn ngữ, cảm ơn rất nhiều :) –

+0

Có, php nghĩ về sự kế thừa khác nhau. Nó ít hơn một 'ngăn xếp' và nhiều hơn một 'hợp nhất'. –

+0

... hm..Tôi thấy, có thể sẽ mất một chút thời gian để làm quen với nó .. –

16

Có vẻ như bạn đang mô tả tính năng PHP được gọi là 'liên kết tĩnh trễ'.

PHP cung cấp hai cú pháp: self::static::.

static được giới thiệu trong PHP 5.3 vì nhiều người mong đợi self để hoạt động mà bạn mô tả.

Xem hướng dẫn PHP để biết thêm: http://php.net/manual/en/language.oop5.late-static-bindings.php

+0

tìm kiếm trong tài liệu ~ cảm ơn bạn :) –

Các vấn đề liên quan