2017-06-19 15 views
5

Từ PHP mannual đoạn thứ hai, nó nói rằng:PHP cuối tĩnh ràng buộc phạm vi nhầm lẫn

static:: introduces its scope.

Tôi đã thử các ví dụ sau đây cho phù hợp:

class Father { 
    public function test(){ 
     echo static::$a; 
    } 
} 

class Son extends Father{ 
    protected static $a='static forward scope'; 
    public function test(){ 
     parent::test(); 
    } 
} 

$son = new Son(); 
$son->test(); // print "static forward scope" 

Nó hoạt động như mô tả. Tuy nhiên, ví dụ sau sẽ gây ra lỗi nghiêm trọng:

class Father { 
    public function test(){ 
     echo static::$a; 
    } 
} 

class Son extends Father{ 
    private static $a='static forward scope'; 
    public function test(){ 
     parent::test(); 
    } 
} 

// print "Fatal erro: Cannot access private property Son::$a" 
$son = new Son(); 
$son->test(); 

Câu hỏi chính của tôi là cách diễn giải từ scope tại đây? Nếu static giới thiệu phạm vi của Son tới Father thì tại sao biến riêng tư vẫn ẩn với Father?

Có hai điều kiện variable phạm vi và visibility phạm vi? Tôi mới PHP xin lỗi nếu điều này nghe có vẻ buồn cười.

+0

Bạn đã đọc https://stackoverflow.com/questions/1912902/what-exactly-are-late-static-bindings-in-php này chưa? –

+0

Mặc dù thuộc tính 'giới thiệu phạm vi' riêng tư không hiển thị với bất kỳ lớp nào khác. –

+0

@ ponury-kostek tks để tham khảo. Tôi đọc nó. Nhưng tôi nghĩ câu hỏi của tôi khác với câu hỏi đó. – spacegoing

Trả lời

1

Có hai điều ở đây: phạm vi và khả năng hiển thị. Cả hai cùng nhau quyết định xem bạn có thể truy cập vào tài sản hay không.

Như bạn đã tìm thấy trong thử nghiệm đầu tiên, liên kết tĩnh muộn cho phép $a có sẵn trong phạm vi của lớp Father. Điều đó đơn giản có nghĩa là biến (không nhất thiết là giá trị của nó) là "đã biết" đối với lớp này.

Hiển thị quyết định xem các biến trong phạm vi có thể được truy cập bởi các lớp và trường hợp cụ thể hay không. Thuộc tính riêng chỉ hiển thị với lớp mà nó được định nghĩa. Trong ví dụ thứ hai của bạn, $a được xác định private trong phạm vi Son. Có hay không bất kỳ lớp nào khác nhận thức được nó tồn tại, nó không thể được truy cập bên ngoài của Son.

static làm cho $a thuộc tính được biết là Father, nhưng khả năng hiển thị của thuộc tính quyết định có thể truy cập giá trị của thuộc tính hay không.

Để kiểm tra để hiểu thêm, hãy thử sử dụng self thay vì static. Bạn sẽ nhận được một lỗi khác mà $a không phải là tài sản của Father.

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