将字符串传递到具有类型提示的方法时出错
Posted
技术标签:
【中文标题】将字符串传递到具有类型提示的方法时出错【英文标题】:Error when passing string into method with type hinting 【发布时间】:2011-03-07 23:14:02 【问题描述】:在下面的代码中,我调用了一个函数(它恰好是一个构造函数),其中我有类型提示。当我运行代码时,出现以下错误:
可捕获的致命错误:传递给 Question::__construct() 的参数 1 必须是字符串的实例,字符串给定,在第 3 行的 run.php 中调用并在 question 中定义。 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;
?>
【问题讨论】:
【参考方案1】:PHP 不支持标量值的类型提示。目前,它只适用于类、接口和数组。在您的情况下,它期望一个对象是“字符串”类的实例。
目前在 PHP 的 SVN 主干版本中有一个实现支持此功能,但尚未确定该实现是否会在未来的 PHP 版本中发布,或者是否完全支持。
【讨论】:
这是因为标量在 PHP 中都是根据需要相互按摩的,所以 0 == false 等。例如,您不能键入提示标量。这引起了关于 PHP 内部的大量讨论,我是其中的一员。【参考方案2】:只需从构造函数 (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;
【讨论】:
【参考方案3】:类型提示只能用于对象数据类型(或自 5.1 起的数组),不能用于字符串、整数、浮点数、布尔值等基本类型
【讨论】:
【参考方案4】:来自 PHP 文档 (http://php.net/manual/en/language.oop5.typehinting.php)
类型提示只能是对象和数组(自 PHP 5.1 起)类型。不支持使用 int 和 string 进行传统类型提示。
无法提示string
s、int
s 或任何其他原始类型
【讨论】:
【参考方案5】:注意
“类型声明”(又称“类型提示”)自 PHP 7.0.0 起可用于以下类型:
bool
参数必须是布尔值。
float
参数必须是浮点数。
int
参数必须是整数。
string
参数必须是字符串。
bool
参数必须是布尔值。
自 PHP 7.1.0 以来的以下类型:
iterable
参数必须是数组或Traversable 实例。
所以从现在开始,这个问题的另一个答案实际上是(有点):
将 PHP 版本切换到 PHP7.x,代码将按预期运行。
http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration
【讨论】:
以上是关于将字符串传递到具有类型提示的方法时出错的主要内容,如果未能解决你的问题,请参考以下文章