Ошибка при передаче строки в метод с типом намека
В приведенном ниже коде я вызываю функцию (это, случается, конструктор), в которой я набираю тип. Когда я запускаю код, я получаю следующую ошибку:
Допустимая фатальная ошибка: аргумент 1 передан в вопрос:: __ construct() должен быть экземпляром строки, заданной строки, вызываемой в run.php в строке 3 и определенной в вопросе. 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
Просто удалите 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
PHP не поддерживает подсказку типа для скалярных значений. В настоящее время это возможно только для классов, интерфейсов и массивов. В вашем случае он ожидает объект, являющийся экземпляром класса "строка".
В настоящее время реализована реализация, поддерживающая это в версии SVN trunk версии PHP, но она не определилась, будет ли эта реализация выпущена в будущих версиях PHP или вообще будет поддерживаться.
Ответ 3
Тип hinting может использоваться только для типов данных объекта (или массивов с 5.1), а не для базовых типов типа string, integer, float, boolean
Ответ 4
Из документации PHP (http://php.net/manual/en/language.oop5.typehinting.php)
Тип подсказки может быть только типа объекта и массива (начиная с PHP 5.1). Традиционный тип hinting с int и string не поддерживается.
Невозможно намекнуть string
s, int
или любой другой примитивный тип
Ответ 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