2010-03-21 43 views
9

Có phải là abstract function xxx?Tương đương với các chức năng ảo của C++ trong PHP là gì?

Tôi vừa thực hiện một bài kiểm tra dường như chỉ ra một phương pháp riêng tư cũng là ảo?

class a { 
private function test() 
{ 
    echo 1; 
} 
} 

class b extends a { 
private function test() 
{ 
    echo 2; 
} 
public function call() 
{ 
    $this->test(); 
} 
} 

$instance = new b; 
$instance->call(); 

Đầu ra là 2

Trả lời

18

Trong PHP tất cả các chức năng riêng không là ảo do đó không cần phải tuyên bố rõ ràng chúng như ảo.

Khai báo hàm thành viên là abstract chỉ đơn giản có nghĩa là lớp cơ sở không thể cung cấp triển khai nhưng tất cả các lớp bắt nguồn phải. Xác định phương pháp như trừu tượng cũng giống như cách làm như sau trong

virtual void foo() = 0; 

C++ mà chỉ đơn giản có nghĩa là thừa kế các lớp phải thực hiện foo();

EDIT: Về câu hỏi sửa

b::call() không thể truy cập a::test(). Vì lý do này khi gọi các hàm riêng tư chỉ có một trong lớp mà nó được gọi từ sẽ được gọi.

EDIT: Về nhận xét:

(Từ Wikipieda)

Trong lập trình hướng đối tượng, một hàm ảo hoặc phương pháp ảo là một chức năng hoặc các phương pháp mà hành vi có thể được ghi đè trong vòng một lớp kế thừa bởi một hàm có cùng chữ ký.

Do ý tưởng nêu rõ những gì bạn thanh toán trong C++, bạn phải khai báo hàm là ảo để cho phép các lớp dẫn xuất ghi đè hàm.

class Foo{ 
public: 
    void baz(){ 
     std::cout << "Foo"; 
    } 
}; 
class Bar : public Foo{ 
public: 
    void baz(){ 
     std::cout << "Bar"; 
    } 
}; 

int main(){ 
    Foo* f = new Bar(); 
    f->baz(); //baz is not virtual in Foo, so the output is Foo 
} 

Thay đổi baz là ảo

class Foo{ 
public: 
    virtual void baz(){ 
     std::cout << "Foo"; 
    } 
}; 
//Same Bar declaration 

int main(){ 
    Foo* f = new Bar(); 
    f->baz(); //baz is virtual in Foo, so the output is Bar as it will call the derived function 
} 

Lưu ý, nếu biến f trong ví dụ trên là loại Bar* hoặc Bar nó sẽ không quan trọng nếu Foo::baz() là ảo hay không như các loại dự kiến được biết đến (Lập trình viên đã cung cấp nó rõ ràng)

+0

Cám ơn demo, tôi hiểu những gì có nghĩa là ảo now.But thể bạn cũng chứng minh nó với PHP?Bởi vì dường như trong PHP không thể chuyển đổi một đối tượng thành lớp cơ sở, nói cách khác, không có khái niệm nào như ảo trong PHP? – user198729

+2

Không có khái niệm nào như ảo trong php. Hoặc theo cách khác, mọi phương thức đều là ảo vì việc triển khai thực tế được xem xét trong thời gian chạy. – VolkerK

+0

Tôi nghĩ tốt hơn nên nghĩ rằng không có khái niệm ảo trong PHP, vì không thể làm điều này bằng ngôn ngữ này: 'Foo * f = new Bar();' – user198729

4

Ví dụ không hiển thị mẫu chuyên môn điển hình trong đó b không cần biết chi tiết triển khai của call() nhưng có thể ify cách thực hiện test(). Và nó trở lại không may là 1. Tuy nhiên bằng cách khai báo hàm được bảo vệ thay vì riêng tư, nó sẽ hoạt động như mong đợi.

class a { 
    protected function test() 
    { 
     echo 1; 
    } 
    public function call() { 
     $this->test(); 
    } 
} 

class b extends a { 
    protected function test() 
    { 
     echo 2; 
    } 
} 

$instance = new b(); 
$instance->call(); 
1

sử dụng tĩnh từ khóa (php 5.4) không $ this-> meth() nhưng tĩnh :: meth()

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