2011-02-09 48 views
9

Trong chương trình PHP, tôi có một mảng của một số đối tượng tùy chỉnh và tôi muốn tìm xem mảng có chứa một đối tượng nhất định hay không. Tất nhiên tôi có thể sử dụng array_search, nhưng điều này sẽ kiểm tra nếu các đối tượng là cùng một đối tượng, không nếu nó có các biến tương tự. Vì vậy, tôi muốn để có thể tạo ra chức năng so sánh của riêng tôi cho các đối tượng, mà tôi có thể sử dụng với phương pháp array_search (hoặc một cái gì đó tương tự). Tôi muốn có thể thực hiện một việc như sau:Quá tải php bằng toán tử

class foo 
{ 
    public $_a,$_b; 
    function __construct($a,$b) 
    { 
     $this->_a = $a; 
     $this->_b = $b; 
    } 

    function __equals($object) 
    { 
     return $this->_a == $object->_a; 
    } 
} 
$f1 = new foo(5,4); 
$f2 = new foo(4,6); 
$f3 = new foo(4,5); 

$array = array($f1,$f2); 
$idx = array_search($f3,$array); // return 0 

Có điều gì đó như thế này có thể? Tôi biết tôi cũng có thể tạo phương thức array_search của riêng mình sử dụng phương thức từ lớp, nhưng tôi phải sử dụng 2 hàm tìm kiếm khác nhau, một cho các lớp có chức năng so sánh riêng và một cho 't.

+2

array_search chỉ kiểm tra xem các đối tượng có cùng một phiên bản nếu bạn đặt thông số $ strict thứ ba thành true. Nếu không, hai đối tượng được coi là bằng nhau nếu chúng "có cùng thuộc tính và giá trị, và là các thể hiện của cùng một lớp" - xem hành vi của [==] (http://php.net/manual/en/language. oop5.object-compar.php) toán tử. – yscik

Trả lời

8

Dưới đây là một mẹo nhỏ gọn thời gian gần đây tôi phát hiện ra:

class Foo { 
    public $a; 
    public $b; 

    public function __toString() { 
     return (string)$this->a; 
    } 

    public function __construct($a, $b) { 
     $this->a = $a; 
     $this->b = $b; 
    } 

} 

$a = new Foo(1, 'a'); 
$b = new Foo(2, 'b'); 
$c = new Foo(3, 'c'); 
$d = new Foo(2, 'd'); 
$array = array($a, $b); 

$key = array_search($d, $array);   // false 

$key = array_search((string)$c, $array); // false 
$key = array_search((string)$d, $array); // 1 

này cũng hoạt động:

$is_equal = ((string)$d == $b);   // true 

Khi đã thông qua một chuỗi $ kim, array_search sẽ cố gắng để đúc các đối tượng chứa trong $ haystack thành chuỗi để so sánh chúng, bằng cách gọi phương thức ma thuật __toString nếu nó tồn tại, trong trường hợp này trả về Foo::$a.

+1

Cảm ơn! đó là một mẹo rất hay! – Tiddo

+0

Điều đó rất hữu ích. Miễn là bạn đang so sánh một đối tượng với một chuỗi, PHP sẽ ép nó vào một giá trị chuỗi bằng cách sử dụng phương thức '__toString' của nó. –

3

Thường thì không. Bạn có thể xem PECL Operators -Extension, nhưng điều đó thực sự cũ.

+2

Nó đã được cập nhật ngay bây giờ cho 5.3 * và * 5.4, nhưng một gói mà đi 7 năm giữa các bản phát hành không chính xác truyền cảm hứng cho sự tin tưởng của nó ... –

+1

@XiongChiamiov Phụ thuộc. Nếu nó hoạt động, không cần cập nhật, phải không? – KingCrunch

+1

Hơn nữa, nó vẫn ở trạng thái beta. Bạn nên cân nhắc rằng nếu bạn định sử dụng nó trong môi trường sản xuất. –