Волшебный метод PHP __toNumber (), преобразующий объект в число - PullRequest
1 голос
/ 24 мая 2019

Есть ли способ реализовать преобразование объекта в число в 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 не может быть преобразован в число

список магических методов PHP не имеет никакого метода __toNumber(), но, возможно, есть обходной путь к этому?Очевидно, кроме использования геттера, как:

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

У вас есть идеи?

Ответы [ 2 ]

2 голосов
/ 24 мая 2019

Комментарий был отправлен с решением, прежде чем я смог закончить свой ответ, но самое близкое, что вы можете получить, используя __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;

Демо

0 голосов
/ 24 мая 2019

Другой обходной путь, который я придумал:

<?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);

выглядит очень противоречивым в использовании, но дает желаемый результат.

...