在下面的代码中,我调用了一个函数(它恰好是一个构造函数),其中我有类型提示。当我运行代码时,我收到以下错误:
可捕获的致命错误:传递给Question :: __ construct()的参数1必须是字符串的实例,给定字符串,在第3行的run.php中调用,并在问题中定义。 php 在线 15
据我所知,错误告诉我该函数正在期待一个字符串但是传递了一个字符串。为什么不接受传递的字符串?
run.php :
<?php
require 'question.php';
$question = new Question("An Answer");
?>
question.php :
<?php
class Question
{
/**
* The answer to the question.
* @access private
* @var string
*/
private $theAnswer;
/**
* Creates a new question with the specified answer.
* @param string $anAnswer the answer to the question
*/
function __construct(string $anAnswer)
{
$this->theAnswer = $anAnswer;
}
}
?>
答案 0 :(得分:28)
PHP不支持标量值的类型提示。目前,它只适用于类,接口和数组。在您的情况下,它期望一个对象是“字符串”类的实例。
目前在PHP的SVN主干版本中有一个支持这一功能的实现,但如果该实现将是在未来版本的PHP中发布的实现,或者它将得到支持,那么它尚未确定。
答案 1 :(得分:8)
只需从构造函数(not supported)中删除string
,它应该可以正常工作,例如:
function __construct($anAnswer)
{
$this->theAnswer = $anAnswer;
}
工作示例:
class Question
{
/**
* The answer to the question.
* @access private
* @var string
*/
public $theAnswer;
/**
* Creates a new question with the specified answer.
* @param string $anAnswer the answer to the question
*/
function __construct($anAnswer)
{
$this->theAnswer = $anAnswer;
}
}
$question = new Question("An Answer");
echo $question->theAnswer;
答案 2 :(得分:4)
类型提示只能用于对象数据类型(或自5.1以来的数组),而不能用于基本类型,如字符串,整数,浮点数,布尔值
答案 3 :(得分:2)
从PHP文档(http://php.net/manual/en/language.oop5.typehinting.php)
类型提示只能是对象和数组(自PHP 5.1以来)类型。不支持使用int和string的传统类型提示。
无法提示string
s,int
或任何其他原始类型
答案 4 :(得分:0)
注意强>
&#34;输入声明&#34; (又名&#34;类型提示&#34;)自PHP 7.0.0起可用于以下类型:
bool
参数必须是布尔值。float
参数必须是浮点数。 int
参数必须是整数。string
参数必须是字符串。bool
参数必须是布尔值。以下类型:
iterable
参数必须是数组或Traversable的实例。所以从现在开始,这个问题的另一个答案实际上是(有点):
将PHP版本切换到PHP7.x,代码将按预期工作。
http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration