我不确定标题应该是什么,但是代码应该更好地解释它:

class Group {
    private $number = 20;

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

$number = new Group();
echo $number, PHP_EOL;
echo ++ $number, PHP_EOL;

echo PHP_EOL;

$number = "20";
echo $number, PHP_EOL;
echo ++ $number, PHP_EOL;

echo PHP_EOL;

$number = 20;
echo $number, PHP_EOL;
echo ++ $number, PHP_EOL;

输出:
20
20              <--- Expected 21

20
21

20
21

知道为什么我得到20而不是21吗?即使这样,下面的代码仍然有效:
$i = null ;
echo ++$i ; // output 1

我知道Group是实现__toString的对象,我希望++__toString或至少throw an error中的字符串一起使用

最佳答案

操作发生的顺序很重要:

  • 该变量将作为对象获取,不会被强制转换为整数(或其他)。
  • ++运算符增加lvalzval(长值),但通常不执行其他任何操作。对象指针保持不变。内部(fast_)increment_function将被zval调用,该zval具有指向对象的指针,该对象首先检查类型。如果是对象,则不执行任何操作。因此,当__toString是一个对象时,它与无操作一样有用。这不会输出任何警告。
  • 然后,echo指令对他的参数执行字符串转换:20方法被调用并返回20
  • ojit_code将被输出。
  • 关于php - "__toString"的增量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16375331/

    10-16 15:31