<?php
function phpwtf($s) {
$s = (string) $s;
echo "$s\n";
}
phpwtf("Type hinting is da bomb");
-1
也许不安全和漂亮,但如果你必须:
class string
{
private $Text;
public function __construct($value)
{
$this->Text = $value;
}
public function __toString()
{
return $this->Text;
}
}
function Test123(string $s)
{
echo $s;
}
Test123(new string("Testing"));
9 回答
在PHP 7之前type hinting只能用于强制对象和数组的类型 . 标量类型不是类型可约束的 . 在这种情况下,期望
string
类的对象,但是你给它一个(标量)string
. 错误消息可能很有趣,但它不应该开始工作 . 鉴于动态类型系统,这实际上会产生某种变态感 .您只能手动"type hint"标量类型:
来自PHP's manual:
所以你拥有它 . 错误消息并不是真的有用,但我告诉你 .
** 2017年编辑**
PHP7引入了更多的函数数据类型声明,并且上述链接已移至Function arguments : Type declarations . 从那个页面:
最后一个警告实际上很重要,以理解错误“类型字符串的参数必须,字符串给出”;因为大多数只允许类/接口名称作为参数类型,PHP试图找到一个类名“string”,但找不到任何因为它是一个基本类型,因此失败了这个尴尬的错误 .
PHP允许“提示”提供指定对象的类 . 根据PHP手册,“类型提示只能是对象和数组(自PHP 5.1以来)类型 . 不支持使用int和string的传统类型提示 . ”错误令人困惑,因为您选择“字符串” - 将“myClass”放在其位置并且错误将以不同方式读取:“传递给phpwtf()的参数1必须是myClass的实例,字符串给出”
正如其他人已经说过的,类型提示目前仅适用于对象类型 . 但我认为您触发的特定错误可能是准备即将发生的字符串类型SplString .
从理论上讲,它的行为类似于字符串,但由于它是一个对象,因此会传递对象类型验证 . 不幸的是它还没有在PHP 5.3中,可能会在5.4中出现,所以没有测试过 .
从PHP 7.0开始,类型声明允许标量类型,因此现在可以使用这些类型:
self
,array
,callable
,bool
,float
,int
,string
. 前三个在PHP 5中可用,但最后四个在PHP 7中是新的 . 如果您使用其他任何东西(例如integer
或boolean
)将被解释为类名 .See the PHP manual for more information .
从Laravel Controller调用函数到PHP文件时出现此错误 .
几个小时后,我发现了问题:我在静态函数中使用 $this .
(最初由leepowers在他的问题中发布)
错误消息令人困惑,原因很简单:
PHP中不保留原始类型名称
以下是所有有效的类声明:
我的错误在于认为错误消息仅指字符串原始类型 - '实例'这个词应该让我暂停 . 一个例子来进一步说明:
输出:
在PHP中,
string
可能是string
,除非它实际上是string
. 与使用隐式类型转换的任何语言一样,上下文就是一切 .我认为对内部块上的php进行类型转换,PHP上的字符串不是对象,因为我知道:
也许不安全和漂亮,但如果你必须: