2013-06-18 31 views
5

Tôi có một chức năng được bảo vệ được xác định trong một lớp nhất định. Tôi muốn có thể gọi hàm được bảo vệ này bên ngoài lớp bên trong một hàm khác. Đây có phải là có thể và nếu như vậy làm thế nào tôi có thể đạt được nóTôi có thể/Làm thế nào để ... gọi một chức năng được bảo vệ bên ngoài một lớp học trong PHP

class cExample{ 

    protected function funExample(){ 
    //functional code goes here 

    return $someVar 
    }//end of function 

}//end of class 


function outsideFunction(){ 

//Calls funExample(); 

} 
+2

Bạn không thể. Điều đó đã đánh bại mục đích của việc có một chức năng được bảo vệ ngay từ đầu.Bạn có thể có phương thức công khai gọi phương thức được bảo vệ thay cho bạn, nhưng tại sao lại có phương thức được bảo vệ để bắt đầu? –

+0

Bản sao của http://stackoverflow.com/q/12255740/2088851 – Voitcus

Trả lời

8

Đó là quan điểm của OOP - đóng gói:

Private

Only can be used inside the class. Not inherited by child classes. 

Protected

Only can be used inside the class and child classes. Inherited by child classes. 

Công

Can be used anywhere. Inherited by child classes. 

Nếu bạn vẫn muốn kích hoạt chức năng bên ngoài, bạn có thể khai báo một phương pháp nào đó gây nên phương pháp bảo vệ của bạn:

protected function b(){ 

} 

public function a(){ 
    $this->b() ; 
    //etc 
} 
2

Bạn có thể ghi đè lên lớp này với nhau, nơi bạn làm này công cộng.

class cExample2 extends cExample { 
    public function funExample(){ 
    return parent::funExample() 
    } 
} 

(lưu ý điều này sẽ không làm việc với các thành viên tư nhân)

Nhưng ý tưởng của các thành viên tư nhân và được bảo vệ là không được gọi từ bên ngoài.

1

Nếu bạn muốn chia sẻ mã giữa các lớp, bạn có thể sử dụng các đặc điểm, nhưng nó phụ thuộc vào cách bạn muốn sử dụng hàm/phương pháp của mình.

Dù sao

trait cTrait{ 
    public function myFunction() { 
     $this->funExample(); 
    } 
} 

class cExample{ 
    use cTrait; 

    protected function funExample() { 
    //functional code goes here 

    return $someVar 
    }//end of function 

}//end of class 

$object = new cExample(); 
$object->myFunction(); 

này sẽ làm việc, nhưng hãy nhớ rằng bạn không biết những gì lớp học của bạn được làm bằng cách này. Nếu bạn thay đổi đặc điểm thì tất cả các lớp của bạn sử dụng nó sẽ bị thay đổi. Nó cũng là thực hành tốt để viết một giao diện cho mọi đặc điểm bạn sử dụng.

1

đây tôi có thể cung cấp cho bạn một ví dụ như dưới đây

<?php 
    class dog { 
     public $Name; 
     private function getName() { 
      return $this->Name; 
     } 
    } 

    class poodle extends dog { 
     public function bark() { 
      print "'Woof', says " . $this->getName(); 
     } 
    } 

    $poppy = new poodle; 
    $poppy->Name = "Poppy"; 
    $poppy->bark(); 
?> 

hoặc một cách khác để sử dụng với php mới nhất

Trong PHP bạn có thể làm điều này bằng Reflections. Để gọi các phương thức được bảo vệ hoặc riêng tư sử dụng phương thức setAccessible() http://php.net/reflectionmethod.setaccessible (chỉ cần đặt nó thành TRUE)

19

Về mặt kỹ thuật, có thể gọi các phương thức riêng và được bảo vệ bằng cách sử dụng API phản chiếu. Tuy nhiên, 99% thời gian làm như vậy là một ý tưởng thực sự tồi tệ. Nếu bạn có thể sửa đổi lớp, thì giải pháp đúng là có thể chỉ làm cho phương thức được công khai. Sau khi tất cả, nếu bạn cần phải truy cập nó bên ngoài lớp học, mà đánh bại các điểm đánh dấu nó được bảo vệ.

Dưới đây là một ví dụ phản ánh nhanh chóng, trong trường hợp này là một trong những rất ít tình huống mà nó thực sự cần thiết:

<?php 
class foo { 
    protected function bar($param){ 
     echo $param; 
    } 
} 

$r = new ReflectionMethod('foo', 'bar'); 
$r->setAccessible(true); 
$r->invoke(new foo(), "Hello World"); 
Các vấn đề liên quan