2011-11-16 40 views
8

Tôi đã tìm thấy đoạn mã bên dưới ở một số địa điểm trên web và thậm chí ở đây trên Stack Overflow, nhưng tôi không thể quấn đầu quanh nó. Tôi biết những gì nó làm, nhưng tôi không biết làm thế nào nó thậm chí với các ví dụ. Về cơ bản nó lưu trữ các giá trị, nhưng tôi không biết làm thế nào tôi thêm các giá trị vào sổ đăng ký. Ai đó có thể vui lòng cố gắng giải thích cách mã này hoạt động, cả cách tôi đặt và truy xuất các giá trị từ nó?Mẫu đăng ký PHP

class Registry { 

    private $vars = array(); 

    public function __set($key, $val) { 
     $this->vars[$key] = $val; 
    } 

    public function __get($key) { 
     return $this->vars[$key]; 
    } 
} 
+0

Bạn nên ngăn chức năng thiết lập ghi đè bằng thứ gì đó như sau (cũng sử dụng array_key_exists, nên sử dụng cho cả hai tập hợp và nhận trong trường hợp này) mà có lẽ cũng quan trọng không sử dụng các khóa không tồn tại vì toàn bộ mục đích đăng ký là để lưu trữ thông tin, đó là loại bị đánh bại bởi khả năng ghi đè: 'tập chức năng công cộng ($ key, $ val) {if (! array_key_exists ($ key, $ this -> _ nfo)) {$ this-> _nfo [$ key] = $ val; }} ' – user1205600

Trả lời

7

Đó là sử dụng PHP của hack trên property overloading để thêm các mục vào và lấy các mục từ $vars mảng tư nhân.

Để thêm một thuộc tính, bạn sẽ sử dụng ...

$registry = new Registry; 
$registry->foo = "foo"; 

Bên trong, điều này sẽ thêm một chìa khóa foo đến các mảng $vars với giá trị chuỗi "foo" thông qua phương thức ma thuật __set.

Để lấy một giá trị ...

$foo = $registry->foo; 

Bên trong, điều này sẽ lấy mục foo từ mảng $vars qua magic method __get.

Phương pháp __get thực sự nên kiểm tra các mục nhập không tồn tại và xử lý những thứ như vậy. Mã as-is sẽ kích hoạt lỗi E_NOTICE cho chỉ mục không xác định.

Một phiên bản tốt hơn có thể là

public function __get($key) 
{ 
    if (array_key_exists($key, $this->vars)) { 
     return $this->vars[$key]; 
    } 

    // key does not exist, either return a default 
    return null; 

    // or throw an exception 
    throw new OutOfBoundsException($key); 
} 
+0

Cảm ơn, tôi nghĩ tôi đã phát điên. Điều này đã giúp tôi quay trở lại và kiểm tra những gì đang diễn ra. Tôi đã cố gắng thiết lập một hành động mẫu, nhưng nó luôn luôn trống rỗng. Hóa ra tôi đã ở trên trang chỉ mục, vì vậy không có giá trị. DOH !. Tôi đã thử mẫu trên một trang khác và nó hoạt động tốt. Cảm ơn bạn đã giúp đỡ. Khi bạn nói bị tấn công, điều đó có nghĩa là nó không nên được sử dụng theo cách này? –

+0

@IanHoar Vâng, nó chắc chắn không nên được gọi là * quá tải * – Phil

+0

@Phil Tôi có thể xem cách bạn thêm khóa, nhưng làm thế nào để bạn thêm một cặp khóa-giá trị? –

8

Bạn có thể muốn kiểm tra PHP.NET - Overloading

Về cơ bản, bạn sẽ làm gì ...

$Registry = new Registry(); 

$Registry->a = 'a'; //Woo I'm using __set 
echo $Registry->a; //Wooo! I'm using __get 

Vì vậy, ở đây, tôi đang sử dụng __set($a, 'This value is not visible to the scope or nonexistent') Ngoài ra, tôi đang sử dụng __get($a);

Hy vọng điều này đã giúp!

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