是否有__toString()的等价整数

时间:2010-09-20 12:15:24

标签: php

有没有办法告诉PHP如何将对象转换为int?理想情况下它看起来像

class ExampleClass
{
    ...

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

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

我意识到它不支持这种确切的形式,但有一个简单的(不那么hacky)解决方法吗?

----------------------编辑编辑编辑---------------------- -------

谢谢大家!我正在研究这个的主要原因是我想制作一些类(表单生成器,菜单类等)使用对象而不是数组(uniqueId => description)。如果您决定只应该使用这些对象,或者只使用扩展某种泛型对象超类的对象,这很容易。

但是我试图看看是否存在中间道路:理想情况下,我的框架类可以接受整数字符串对,或者接受带有getId()和getDescription()方法的对象。因为在我想使用stackoverflow的综合知识来确定是否有一种标准/最佳实践方法来执行此与php标准不冲突之前,这是其他人必定已经发生的事情图书馆,共同框架等

4 个答案:

答案 0 :(得分:8)

我担心没有这样的事情。我不确定你需要这个的原因是什么,但请考虑以下选项:

添加一个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'。类外部的用法可能会自动将此字符串转换为整数。

答案 1 :(得分: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) {
        // ....
    }
}

答案 2 :(得分:0)

__toString()作为一种神奇的方法存在。

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

__toInt()没有。

答案 3 :(得分:0)

您可以使用重新键入:

@api.constrains('name', 'state')
    def _check_name(self):
        for field in self:
            if field.state == 'manual' and not field.name.startswith('x_'):
                raise ValidationError(_("Custom fields must have a name that starts with 'x_' !"))
            try:
                models.check_pg_name(field.name)
            except ValidationError:
                msg = _("Field names can only contain characters, digits and underscores (up to 63).")
                raise ValidationError(msg)