增加"__toString"

Bab*_*aba 9 php increment magic-methods

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

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;
Run Code Online (Sandbox Code Playgroud)

输出:

20
20              <--- Expected 21

20
21

20
21
Run Code Online (Sandbox Code Playgroud)

知道我为什么20而不是21?即使这样,下面的代码也适用:

$i = null ;
echo ++$i ; // output 1
Run Code Online (Sandbox Code Playgroud)

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

bwo*_*ebi 12

操作的顺序很重要:

  1. 变量将作为对象获取,不会被转换为整数(或其他内容).

  2. 这个++算子递增了lval(长值)zval,但通常没有别的.对象指针保持不变.(fast_)increment_function将调用内部,zval其中包含指向对象的指针,该指针首先检查类型.如果它是一个对象,它什么都不做.因此,当您zval是一个对象时,它就像无操作一样有用.这不会输出任何警告.

  3. 只有这样,echo指令__toString才会对其参数执行字符串转换:调用该方法并返回20.

  4. 20 将输出.


The*_*ppo 9

用一点代码回答你的问题.

$number = new Group();
echo gettype($number);

$number = "20";
echo gettype($number);

$number = 20;
echo gettype($number);
Run Code Online (Sandbox Code Playgroud)

会导致

object
string
integer
Run Code Online (Sandbox Code Playgroud)

三种情况:

  • 您不能对对象执行任何整数操作,这就是为什么您的代码没有按预期执行的操作.__toString在您尝试使用它进行数学运算失败后,将在计算实际输出时调用非常晚的方法.
  • 您可以使用字符串进行数学运算,因为PHP会在内部将它们转换回数字
  • 显然你可以用整数做数学

奖金:

这将有效:

$number = new Group();
echo 1 + "$number"; // 21
Run Code Online (Sandbox Code Playgroud)

它将您的对象转换为字符串,可以将其转换为数字运算的数字.