【问题标题】:PHP magic method __toNumber() converting object to numberPHP魔术方法__toNumber()将对象转换为数字
【发布时间】:2019-10-11 09:23:19
【问题描述】:

有没有办法在 PHP 中实现对象到数字的转换?

有一个方便的魔术函数__toString()可以将对象转换为字符串,但是对象转换为数字呢?

使用示例:

<?php

class Foo
{
    /**
     * @var float
     */
    private $factor;

    public function __construct(float $factor)
    {
        $this->factor = $factor;
    }
}

$foo = new Foo(1.23);
$boo = 2;

$result = $foo*$boo;

//wanted output 2.46
echo $result;

该代码生成 PHP 通知 (PHP 7.3)

Foo 类的对象无法转换为数字

list of PHP's magic methods 没有任何__toNumber() 方法,但也许有解决方法? 显然除了使用 getter 之外:

getFactor() : float
{
     return $this->factor;
}

你有什么想法吗?

【问题讨论】:

  • 不是很直观,但你可以有__invoke() 只是return $this-&gt;factor; 然后使用$foo()*$boo; 调用

标签: php type-conversion magic-methods


【解决方案1】:

在我完成答案之前,已针对解决方案发布了评论,但使用 __invoke() 是您可以获得的最接近的答案:

<?php

class Foo
{
    /**
     * @var float
     */
    private $factor;

    public function __construct(float $factor)
    {
        $this->factor = $factor;
    }

    public function __invoke()
    {
        return $this->factor;
    }
}

$foo = new Foo(1.23);
$boo = 2;

$result = $foo() * $boo;

//wanted output 2.46
echo $result;

Demo

【讨论】:

  • 我将它作为评论发布,因为我只是觉得 $foo() 看起来很奇怪。
  • 确实如此,并且有更直观的方法来做到这一点
【解决方案2】:

我想出的另一个解决方法是:

<?php

class Foo
{
    /**
     * @var float
     */
    private $factor;

    public function __construct(float $factor)
    {
        $this->factor = $factor;
    }

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

$foo = new Foo(1.23);
$boo = 2;

$result = (string) $foo * $boo;

//wanted output 2.46
echo $result;

echo " ";

//double
echo gettype($result);

使用起来看起来很反直觉,但会产生想要的结果。

【讨论】:

    猜你喜欢
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 2012-01-21
    相关资源
    最近更新 更多