All Projects → nikic → comparable

nikic / comparable

Licence: other
PHP extension implementing a magic "Comparable" interface

Programming Languages

c
50402 projects - #5 most used programming language

Comparable interface for PHP

Note: This is to the most part just code demonstrating the implementation of a magic interface for a tutorial. I do not currently plan on proposing including such an interface for PHP itself.

This extension implements a magic Comparable interface for PHP:

interface Comparable {
    static function compare($obj1, $obj2);
}

When two objects (both implementing the interface) are comapred using <, > or == the compare() method will be invoked. One should not rely on which class the method is invoked on. (Due to technical reasons for $l < $r it will be called on the class of $l, but for $l > $r it will be called on the class of $r.)

The compare() method can either return null to fall back to the default comparison behavior or one of the integer values -1 (for "smaller"), 0 (for "equal") and 1 (for "greater"). If the returned value is not an integer, it will be cast to one. If it is not one of -1, 0 or 1 it will be normalized to them.

An example (not sure how much sense it makes):

<?php

class Point implements Comparable {
    protected $x, $y, $z;

    public function __construct($x, $y, $z) {
        $this->x = $x; $this->y = $y; $this->z = $z;
    }

    public static function compare($p1, $p2) {
        if ($p1->x == $p2->x && $p1->y == $p2->y && $p1->z == $p2->z) {
            return 0;
        }

        if ($p1->x < $p2->x && $p1->y < $p2->y && $p1->z < $p2->z) {
            return -1;
        }

        if ($p1->x > $p2->x && $p1->y > $p2->y && $p1->z > $p2->z) {
            return 1;
        }

        return 1;
    }
}

$p1 = new Point(1, 1, 1);
$p2 = new Point(2, 2, 2);
$p3 = new Point(1, 0, 2);

var_dump($p1 < $p2, $p1 > $p2, $p1 == $p2); // true, false, false

var_dump($p1 == $p1); // true

var_dump($p1 < $p3, $p1 > $p3, $p1 == $p3); // false, false, false

Installation

The extension is installed as usual:

./configure --enable-comparable
make
make install
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].