Существует ли целочисленный эквивалент __toString()

Есть ли способ сказать PHP, как конвертировать ваши объекты в ints? В идеале это выглядело бы как

class ExampleClass
{
    ...

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

    public function __toInt()
    {
        return $this->getId();
    }
}

Я понимаю, что это не поддерживается в этой точной форме, но есть ли простой (не так-хаки) обходной путь?

---------------------- EDIT EDIT EDIT ---------------------- -------

Спасибо всем! Основная причина, по которой я смотрю на это, - это сделать некоторые классы (генераторы форм, классы меню и т.д.) Использовать объекты вместо массивов (uniqueId = > description). Это достаточно легко, если вы решите, что они должны работать только с этими объектами или только с объектами, которые расширяют какой-то общий суперкласс класса.

Но я пытаюсь посмотреть, есть ли средняя дорога: в идеале мои классы framework могли бы принимать пары целых строк или объекты с методами getId() и getDescription(). Поскольку это то, что должно было произойти с кем-то еще, прежде чем я хотел бы использовать совместное знание stackoverflow, чтобы узнать, существует ли стандартный/лучший способ сделать это , который не сталкивается с стандартом php библиотека, общие рамки и т.д..

Ответы

Ответ 1

Я боюсь, что нет такой вещи. Я не совсем уверен, зачем вам это нужно, но рассмотрите следующие варианты:

Добавление метода toInt(), кастинг в классе. Возможно, вы уже знаете об этом.

public function toInt()
{
    return (int) $this->__toString();
}

Двойное кастинг вне класса приведет к int.

$int = (int) (string) $class;

Сделать специальную функцию вне класса:

function intify($class)
{
    return (int) (string) $class;
}
$int = intify($class);

Конечно, метод __toString() может возвращать строку с номером в ней: return '123'. Использование вне класса может автоматически преобразовать эту строку в целое число.

Ответ 2

Сделайте свои объекты реализацией ArrayAccess и Iterator.

class myObj implements ArrayAccess, Iterator
{
}

$thing = new myObj();
$thing[$id] = $name;

Затем в коде, который потребляет эти данные, вы можете использовать тот же самый код массива старого стиля, который у вас был раньше:

// Here, $thing can be either an array or an instance of myObj
function doSomething($thing) {
    foreach ($thing as $id => $name) {
        // ....
    }
}