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

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 进行传统类型提示。

无法提示strings、ints 或任何其他原始类型

【讨论】:

【参考方案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

【讨论】:

以上是关于将字符串传递到具有类型提示的方法时出错的主要内容,如果未能解决你的问题,请参考以下文章

将字符串作为参数传递时出错(Solidity)

将二维字符串数组传递给函数时出错 (C++)

将字符串和字符传递给布尔函数时出错

生成 <DbContext> 时出错

Pandas 尝试将字符串转换为整数时出错

将对象数组从 PLSQL 传递到 Java 函数时出错