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
操作的顺序很重要:
变量将作为对象获取,不会被转换为整数(或其他内容).
这个++算子递增了lval(长值)zval,但通常没有别的.对象指针保持不变.(fast_)increment_function将调用内部,zval其中包含指向对象的指针,该指针首先检查类型.如果它是一个对象,它什么都不做.因此,当您zval是一个对象时,它就像无操作一样有用.这不会输出任何警告.
只有这样,echo指令__toString才会对其参数执行字符串转换:调用该方法并返回20.
20 将输出.
用一点代码回答你的问题.
$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在您尝试使用它进行数学运算失败后,将在计算实际输出时调用非常晚的方法.奖金:
这将有效:
$number = new Group();
echo 1 + "$number"; // 21
Run Code Online (Sandbox Code Playgroud)
它将您的对象转换为字符串,可以将其转换为数字运算的数字.
| 归档时间: |
|
| 查看次数: |
402 次 |
| 最近记录: |