2013-06-01 33 views
7

Tôi đang cố gắng viết một lớp PHP trong đó tôi thay đổi khả năng hiển thị của một vài phương thức từ bảo vệ thành công cộng. Tôi tin rằng tôi nhớ bạn có thể làm điều này trong C + +, nhưng tôi đã làm một vài tìm kiếm và tôi không đến với bất cứ điều gì cho rằng trong PHP. Có ai biết nếu điều này thậm chí có thể trong PHP?Phương thức thay đổi PHP/chức năng hiển thị

Ví dụ, giả sử lớp này:

class ABC { 
    protected function foo() { 
      // Do something 
    } 
    } 

    class DEG extends ABC { 
     // can I make foo public now? 
    } 

Trả lời

11

Bạn có thể thay đổi khả năng hiển thị của các thành viên khi bắt nguồn từ một lớp cơ sở như thế này:

class Base 
{ 
    protected function foo() {} 
} 

class Derived extends Base 
{ 
    public function foo() { return parent::foo(); } 
} 

Bạn cũng có thể làm tương tự với tài sản (xác định lại một tài sản protectedpublic).

Tuy nhiên, lưu ý rằng nếu thuộc tính cơ sở là private thì bạn sẽ không thực sự tăng khả năng truy cập của nó mà là khai báo thuộc tính mới có cùng tên. Đây không phải là vấn đề với các hàm, như thể bạn đã cố gắng gọi một phương thức cơ bản là private, bạn sẽ ngay lập tức nhận được lỗi thời gian chạy.

+0

Có, và điều này thực sự khác với C++ (nơi bạn không thể 'ở trên' bộ sửa đổi hiển thị trong lớp dẫn xuất). – raina77ow

+0

được, cảm ơn bạn! –

+0

Bạn có thể chỉ cho chúng tôi cách thay đổi mức độ hiển thị của một thuộc tính được bảo vệ trong cơ sở thành công khai trong nguồn gốc không? Cảm ơn! –

-1

Vâng, nó có thể được thực hiện. Trích dẫn từ PHP manual ..

Khả năng hiển thị thuộc tính hoặc phương pháp có thể được xác định bằng cách đặt trước tuyên bố với từ khóa công khai, được bảo vệ hoặc riêng tư. Lớp thành viên được khai báo công khai có thể được truy cập ở mọi nơi. Các thành viên được tuyên bố là được bảo vệ chỉ có thể được truy cập trong chính lớp đó và bởi các lớp kế thừa và cha mẹ. Các thành viên được khai báo là riêng tư chỉ có thể được truy cập bởi lớp xác định thành viên là .

Và ví dụ từ đó cũng ..

class MyClass 
{ 
    public $public = 'Public'; 
    protected $protected = 'Protected'; 
    private $private = 'Private'; 

    function printHello() 
    { 
     echo $this->public; 
     echo $this->protected; 
     echo $this->private; 
    } 
} 

$obj = new MyClass(); 
echo $obj->public; // Works 
echo $obj->protected; // Fatal Error 
echo $obj->private; // Fatal Error 
$obj->printHello(); // Shows Public, Protected and Private 

Sửa: Vâng, bạn có thể thay đổi tầm nhìn của các thành viên cộng đồng và bảo vệ. Một ví dụ khác từ PHP tay ..

/** 
* Define MyClass2 
*/ 
class MyClass2 extends MyClass 
{ 
    // We can redeclare the public and protected method, but not private 
    protected $protected = 'Protected2'; 

    function printHello() 
    { 
     echo $this->public; 
     echo $this->protected; 
     echo $this->private; 
    } 
} 

$obj2 = new MyClass2(); 
echo $obj2->public; // Works 
echo $obj2->private; // Undefined 
echo $obj2->protected; // Fatal Error 
$obj2->printHello(); // Shows Public, Protected2, Undefined 

?> 
+0

Ví dụ này không thể hiện _thay đổi về mức độ hiển thị_ của bất kỳ thành viên lớp nào, nó chỉ biểu thị _difference_ giữa chế độ hiển thị riêng tư, được bảo vệ và công khai. "bạn có thể thay đổi khả năng hiển thị của các thành viên công cộng và được bảo vệ" - bạn chỉ có thể _increase_ khả năng hiển thị của các thành viên trong lớp, do đó bạn không thể thực sự _change_ khả năng hiển thị của thành viên lớp đã được công khai. – MrWhite

3
  • Bạn có thể ghi đè phương thức trong lớp dẫn xuất để làm tăng khả năng hiển thị của nó (ví dụ: protected-> public). Làm cho hàm mới trả về cha mẹ của nó.
  • Bạn không thể làm như vậy để hạn chế khả năng hiển thị của nó (ví dụ: bảo vệ công cộng), nhưng bạn có thể thực hiện một phương pháp kiểm tra backtrace cho người gọi và ngăn chặn ngoại lệ nếu đó là một lớp học nước ngoài.
  • Bạn luôn có thể sử dụng reflection API để thực hiện tất cả các loại thay đổi đối với chế độ hiển thị.
Các vấn đề liên quan