2009-11-22 32 views
6

Phương pháp của đối tượng có thể truy cập thuộc tính được bảo vệ của đối tượng khác của cùng một lớp không?Phương pháp truy cập thuộc tính được bảo vệ của đối tượng khác của cùng một lớp

Tôi đang mã hóa bằng PHP và tôi vừa phát hiện ra rằng thuộc tính được bảo vệ của đối tượng được phép truy cập bằng một phương thức của cùng một lớp ngay cả khi không thuộc cùng một đối tượng.

Trong ví dụ, lúc đầu, bạn sẽ nhận được "3" ở đầu ra - vì hàm readOtherUser sẽ truy cập thành công giá trị - và sau đó lỗi PHP gây tử vong sẽ xảy ra - vì chương trình chính sẽ không thành công truy cập cùng một giá trị.

<?php 

class user 
{ 
protected $property = 3; 

public function readOtherUser() 
{ 
    $otherUser = new user(); 
    print $otherUser->property; 
} 
} 

$user = new user(); 

$user->readOtherUser(); 
print $user->property; 

?>

Đây có phải là lỗi PHP hay là hành vi dự định (và tôi sẽ phải học lại khái niệm này ... :)) (và có tham chiếu đến thực tế) không? Làm thế nào nó được thực hiện trong các ngôn ngữ lập trình khác?

Cảm ơn!

+1

NB. Ruby's ['private'] (http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_classes.html#s4) hoạt động như mô tả - một phương thức riêng không thể được gọi trên một cá thể khác. – outis

Trả lời

6

Đây là mục đích. Thậm chí có thể truy cập các thành viên tư nhân cùng lớp. Vì vậy, hãy nghĩ về các công cụ sửa đổi là lớp bổ trợ khôn ngoan, chứ không phải các công cụ sửa đổi đối tượng.

PHP không phải là ngôn ngữ duy nhất có tính năng này. Java ví dụ có điều này quá.

2

Đó là hành vi dự định. Một biến hoặc hàm được bảo vệ có nghĩa là nó có thể được truy cập bởi cùng một lớp hoặc bất kỳ lớp nào kế thừa từ lớp đó. Một phương thức được bảo vệ chỉ có thể được gọi từ bên trong lớp, ví dụ: bạn không thể gọi nó như thế này:

$object = new MyClass(); 
$object->myProtectedFunction(); 

Điều này sẽ cho bạn một lỗi. Tuy nhiên, từ bên trong lớp được xác định 'MyClass', bạn hoàn toàn có thể gọi hàm được bảo vệ.

Cùng áp dụng cho các biến thể. Tóm tắt:

use PROTECTED on variables and functions when: 
1. outside-code SHOULD NOT access this property or function. 
2. extending classes SHOULD inherit this property or function. 
Các vấn đề liên quan