Ошибка при передаче строки в метод с подсказкой типа - PullRequest
21 голосов
/ 24 июня 2010

В приведенном ниже коде я вызываю функцию (это бывает конструктор), в которой у меня есть подсказка типа. Когда я запускаю код, я получаю следующую ошибку:

Исправляемая фатальная ошибка : Аргумент 1, переданный в Question :: __ construct () должен быть экземпляром строки, заданной строки, вызванной в run.php в строке 3 и определенной в 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;
   }
}
?>

Ответы [ 5 ]

28 голосов
/ 24 июня 2010

PHP не поддерживает подсказки типов для скалярных значений. В настоящее время это возможно только для классов, интерфейсов и массивов. В вашем случае он ожидает объект, который является экземпляром "строки" class .

В настоящее время существует реализация, поддерживающая это в магистральной версии SVN PHP, но неясно, будет ли эта реализация выпущена в будущих версиях PHP или вообще будет поддерживаться.

8 голосов
/ 24 июня 2010

Просто удалите 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;
4 голосов
/ 24 июня 2010

Подсказка типов может использоваться только для типов данных объекта (или массивов, начиная с 5.1), но не для базовых типов, таких как string, integer, float, boolean

2 голосов
/ 24 июня 2010

Из документации PHP (http://php.net/manual/en/language.oop5.typehinting.php)

Типовые подсказки могут быть только объектного и массивного типа (начиная с PHP 5.1). Традиционный тип подсказок с помощью int и string не поддерживается.

Нельзя намекнуть string с, int с или любой другой примитивный тип

0 голосов
/ 12 октября 2017

ПРИМЕЧАНИЕ

"объявления типов" (также известные как "подсказки типов") доступны для следующих типов, начиная с 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

...