2010-02-21 26 views

Trả lời

19

Vì nó kiểm tra __isset thay vì truy xuất bằng __get.

Đó là tùy chọn tốt hơn để gọi __isset, vì không có tiêu chuẩn về những gì trống. Có lẽ trong bối cảnh của lớp null là một giá trị chấp nhận được. Bạn cũng có thể có một lớp rằng nếu thành viên không tồn tại, nó trả về một đối tượng trống mới, sẽ phá vỡ isset($myObj->item) như trong trường hợp đó nó sẽ luôn luôn trả về true.

0

Hàm ma thuật __get chỉ được gọi khi bạn cố truy cập thuộc tính không tồn tại. Kiểm tra xem một thuộc tính có tồn tại không giống như truy lục nó.

1

Không, không được kích hoạt __get khi bạn đang cố gắng xác định xem thuộc tính có được đặt hay không: kiểm tra xem thuộc tính có được đặt không giống như cố gắng lấy giá trị của nó hay không.

Sử dụng isset kích hoạt phương pháp ma thuật __isset.

Xem:

+0

Dường như tôi không xác định __isset trong ví dụ của mình? – ORM

+0

Dường như bạn đã không thực sự - nhưng, nếu bạn đã định nghĩa nó, nó nên được gọi là ;; và xác định nó hay không không thay đổi bất cứ điều gì về '__get' không được gọi khi bạn đang thử nghiệm nếu một thuộc tính được thiết lập. –

2

Nó chỉ không phải là; bạn có thể sử dụng __isset thay thế. Điều này được đặt ra here.

0
Class A{ 
    public function __get($key){ 
     ... 
    } 
    public function __set($key,$name){ 
     ... 
    } 
    public function __unset($key){ 
     ... 
    } 
    public function __isset($key){ 
     ... 
    } 
} 
$obj = new A(); 
$get = $obj->newproperty;//$obj->__get("newproperty") 
$obj->newproperty = "X";//$obj->__set("newproperty","X") 
$bool = isset($obj->newproperty);//$obj->__isset("newproperty") 
unset($obj->newproperty);//$obj->__unset("newproperty") 
Các vấn đề liên quan