Существует ли целочисленный эквивалент __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) {
// ....
}
}
Ответ 3
__toString()
существует как магический метод.
http://www.php.net/manual/en/language.oop5.magic.php#language.oop5.magic.tostring
__toInt()
нет.