PHP-оператор перегрузки php - PullRequest
       13

PHP-оператор перегрузки php

9 голосов
/ 09 февраля 2011

В программе PHP у меня есть массив некоторых пользовательских объектов, и я хочу узнать, содержит ли массив определенный объект.Конечно, я могу использовать array_search, но при этом проверяется, являются ли объекты одним и тем же объектом, а не имеет ли он одинаковые переменные.Поэтому я хочу иметь возможность создавать свою собственную функцию сравнения для объектов, которую я могу использовать с методом array_search (или чем-то подобным).Я хочу иметь возможность сделать что-то вроде этого:

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

Возможно ли что-то подобное?Я знаю, что могу также создать свой собственный метод array_search, который использует метод из класса, но тогда мне придется использовать 2 разные функции поиска, одну для классов, которые имеют свою собственную функцию сравнения, и одну для тех, у которых нетт.

Ответы [ 2 ]

8 голосов
/ 09 февраля 2011

Вот небольшая хитрость, которую я недавно обнаружил:

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

Это также работает:

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

Когда пропущена строка $ needle , array_search попытается привести объекты, содержащиеся в $ haystack , в строку для сравнения, вызвав магический метод __toString, если он существует, который в этом случае возвращает Foo::$a.

3 голосов
/ 09 февраля 2011

Обычно это не так.Вы можете посмотреть на PECL Operators -Extension, но это действительно старое.

...