2010-09-20 3 views
17

Есть ли способ рассказать PHP о том, как преобразовать объекты в ints? В идеале это будет выглядеть примерно такЕсть ли целочисленный эквивалент __toString()

class ExampleClass 
{ 
    ... 

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

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

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

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

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

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

+0

Я не знаю, как PHP будет знать разницу ? __toString() используется, когда объект напрямую выводится, а не только тип. –

+0

Вы можете сделать класс «Объект», например, на Java, и получить от него все, что есть, а затем реализовать переопределяемый метод. – Raveline

+0

@Phil К счастью, я использую 5.3, поэтому у меня больше нет этой проблемы :) http://php.net/manual/en/language.oop5.magic.php#language.oop5.magic.tostring –

ответ

7

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

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

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

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

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

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

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

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

+0

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

+2

Вот где интерфейсы, правильно? Функция spl_object_hash() возвращает уникальный идентификатор для каждого объекта. Хороший вопрос. – user228395

+0

Сладкий! Но эти идентификаторы изменились бы с запроса на запрос, нет? –

0

__toString() существует как волшебный метод.

http://www.php.net/manual/en/language.oop5.magic.php#language.oop5.magic.tostring

__toInt() нет.

+0

Я думаю, что вы неправильно поняли вопрос;) * Существует ли ** целочисленный эквивалент ** '__toString() '* –

+0

@Felix, я неправильно прочитал его, и я отредактировал свои ответы за несколько секунд до того, как вы ответили :) Спасибо. – Fanis

+1

Спасибо за ваше время! Я знаю, что __toInt() не существует, поэтому я прошу об обходном пути. –

1

Сделайте свои объекты реалистичными 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) { 
     // .... 
    } 
} 
Смежные вопросы