为什么PHP中不允许"传统"类型提示?

mpe*_*pen 8 php type-hinting

刚刚发现PHP中允许类型提示,但不能用于整数,字符串,bool或浮点数.

为什么PHP不允许对整数,字符串等类型进行类型提示?

Lev*_*son 10

由于PHP 7.0有支持bool,int,floatstring.在标量类型RFC中添加了支持.有两种模式:弱和严格.我建议阅读RFC以充分理解差异,但基本上类型转换只发生在弱模式下.

鉴于此代码:

function mul2(int $x) {
    return $x * 2;
}
mul2("1");
Run Code Online (Sandbox Code Playgroud)

在弱模式下(这是默认模式),这将转换"1"1.

要启用严格类型,请添加declare(strict_types=1);到文件的顶部.在严格模式下,将发出错误:

致命错误:传递给mul2()的参数1必须是整数类型,给定字符串


Wis*_*guy 9

PHP的松散类型,你的"原始"类型根据它们使用的上下文自动进行类型化.类型提示不会真正改变它,因为字符串可以用作int,反之亦然.类型提示只对数组和对象等复杂类型有帮助,这些类型不能干净地作为整数,字符串或其他基元进行处理.

换句话说,由于PHP没有特定类型的概念,因此您无法在某处获取int,因为它不知道int究竟是什么.另一方面,对象属于某种类型,因为MyClass不能与MyOtherClass互换.


仅供参考,这是当您尝试在这些类型之间进行转换时所发生的情况(不是详尽的列表):

转换为Object(ref)
"如果将对象转换为对象,则不会对其进行修改.如果将任何其他类型的值转换为对象,则会创建stdClass内置类的新实例.如果该值如果为NULL,则新实例将为空.数组转换为具有按键和相应值命名的属性的对象.对于任何其他值,名为scalar的成员变量将包含该值.

对象为int/float(ref)
未定义的行为

在PHP5中对象为boolean(ref)
,始终为TRUE

Object to string(ref)如果适用,将调用
对象的__toString()魔术方法.

对象到数组(ref)
"如果一个对象被转换为一个数组,结果是一个数组,其元素是对象的属性.键是成员变量名,有一些值得注意的例外:整数属性是不可访问的;私有变量有类名称前置于变量名称;受保护的变量在变量名称前面加上'*'.这些前置值在任一侧都有空字节.这可能会导致一些意外行为."

数组到int/float(ref)
未定义的行为

Array to boolean(ref)
如果数组为空(即没有元素),则计算结果为FALSE - 否则为TRUE.

数组到字符串(ref)
字符串"Array"; 使用print_r()var_dump()打印数组的内容

对象的数组(ref)
"数组转换为具有按键命名的属性的对象,以及相应的值."

  • 好吧,我不能反对.没人说PHP的系统很完美.:-)我,对于一个人来说,通常更喜欢强烈打字的语言. (2认同)