【问题标题】:Convert Class Instance to float将类实例转换为浮动
【发布时间】:2018-02-13 07:35:41
【问题描述】:

假设有这个类:

class Number {
  private $asString;
  private $asFloat;

  public function __construct($input) {
    $this->asString = $input;
    $this->asFloat = $this->parse($input);
  }

  private function parse($input) {…}

  //magic method for $n1 . $n2 operations
  public function __toString() { … }

  //method for $n1 + $n2 operations
  public function __toFloat() { … }
}

很遗憾,__toFloat() 魔法方法不存在。除了:$sum = $n1->toFloat() + $n2->toFloat(),还有什么方法可以在数学运算的上下文中使用对象时,不必一直调用->toFloat() 方法。

在 Javascript 中能够创建 valueOf() 方法,我正在寻找一种在 php 中创建类似内容的方法。有什么想法吗?

【问题讨论】:

  • 我希望 php 有运算符重载,但似乎从未被提及。
  • 您可以使用__invoke(),当脚本尝试将对象作为函数调用时会调用它。这将使您成为示例:$sum = $n1() + $n2()。这很短。请参阅:php.net/manual/en/language.oop5.magic.php#object.invoke 我不会这样做,因为它可能会让阅读您的代码的人感到困惑。
  • @KIKOSoftware 这看起来是个好主意
  • 是的,只需调用
  • 像很多 php 代码一样 - hacks 制作巧妙的技巧,但代码就像阅读炼金术一样。用错误的方式说出来,你的数据就会烟消云散。

标签: php type-conversion operator-overloading


【解决方案1】:

您可以使用invoke 作为这种情况的解决方案

<?php
class Number
{
  private $asString;
  private $asFloat;

  public function __construct($input)
  {
    $this->asString = $input;
    $this->asFloat  = $this->parse($input);
  }

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

  private function parse($input)
  {
    return (float) $input;
  }

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

$n1 = new Number(5);
$n2 = new Number(3);
var_dump($n1() + $n2());

【讨论】:

    猜你喜欢
    • 2015-05-29
    • 2010-10-30
    • 1970-01-01
    • 2023-01-27
    • 2014-11-28
    • 2023-04-10
    • 1970-01-01
    • 2020-07-14
    • 2011-03-15
    相关资源
    最近更新 更多