【问题标题】:Is there an integer equivalent of __toString()是否有 __toString() 的整数等价物
【发布时间】:2010-09-20 12:15:24
【问题描述】:

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

class ExampleClass
{
    ...

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

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

我知道它不支持这种确切的形式,但有没有简单(不那么老套)的解决方法?

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

谢谢大家!我正在研究这个的主要原因是我想让一些类(表单生成器、菜单类等)使用对象而不是数组(uniqueId => 描述)。如果您决定它们只适用于这些对象,或者只适用于扩展某种通用对象超类的对象,这很容易。

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

【问题讨论】:

  • 我不知道 PHP 怎么知道区别? __toString() 用于直接输出对象时,而不仅仅是类型转换。
  • 你可以做一个“对象”类,就像在 Java 中一样,并从它派生所有东西,然后实现一个可覆盖的方法。
  • @Phil 幸运的是我使用的是 5.3,所以我不再有这个问题 :) php.net/manual/en/…
  • 一种可能的情况是将一个对象与一个 int 进行比较:if ($myPseudoInt > 1) - 这会导致一个通知:“PseudoInt 类的对象无法转换为 int”。使用 __toInt() 方法来允许这种比较而无需显式转换会很漂亮。
  • 我们仍在等待,但也许有一天:wiki.php.net/rfc/object_cast_to_types

标签: 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'。在类外使用可能会自动将此字符串转换为整数。

【讨论】:

  • 谢谢!我正在研究这个的原因是我想让一些类(表单生成器、菜单类等)使用对象而不是数组(uniqueId => 描述),但没有专门使它们适应这些对象(失去一般性)或不引入总体 Object 类(失去通用性 + 需要调整大量代码)。我希望能找到某种中介解决方案。
  • 这就是接口的用途,对吧? spl_object_hash() 为每个对象返回一个唯一的 id。不过,这是个好问题。
  • 甜蜜!但是这些 id 会因请求而异,不是吗?
  • spl_object_hash() 为每个新请求返回一个随机散列。
  • 哦,好吧。感谢大家的帮助!
【解决方案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() 没有。

    【讨论】:

    • 我想你误读了这个问题 ;) __toString() 是否有 整数等效
    • @Felix,我确实看错了,我在你回复之前几秒钟编辑了我的答案:) 谢谢。
    • 感谢您的宝贵时间!我知道 __toInt() 不存在,这就是我要求解决方法的原因。
    • 这似乎几乎是正确的答案,也许应该说“__toInt()__toInteger() 都不存在”。
    • 我认为这对于非 OP 观众/观众来说是一个更好的答案。
    【解决方案4】:

    您可以使用重新输入:

    class Num
    {
        private $num;
    
        public function __construct($num)
        {
            $this->num = $num;
        }
    
        public function __toString()
        {
            return (string) $this->num;
        }
    }
    
    $n1 = new Num(5);
    $n2 = new Num(10);
    
    $n3 = (int) (string) $n1 + (int) (string) $n2; // 15
    

    【讨论】:

      猜你喜欢
      • 2013-11-06
      • 2021-03-29
      • 2011-01-16
      • 2020-09-20
      • 2011-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多