将字符串传递给带有类型提示的方法时出错

时间:2010-06-24 18:20:36

标签: php type-hinting

在下面的代码中,我调用了一个函数(它恰好是一个构造函数),其中我有类型提示。当我运行代码时,我收到以下错误:

可捕获的致命错误:传递给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;
   }
}
?>

5 个答案:

答案 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参数必须是布尔值。
自PHP 7.1.0以来

以下类型:

  • iterable参数必须是数组或Traversable的实例。

所以从现在开始,这个问题的另一个答案实际上是(有点):

将PHP版本切换到PHP7.x,代码将按预期工作。

http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration