Вот мой код:
function phpwtf(string $s) {
echo "$s\n";
}
phpwtf("Type hinting is da bomb");
Что приводит к этой ошибке:
Исправляемая фатальная ошибка: аргумент 1, передаваемый в phpwtf (), должен быть экземпляром string, string
Больше, чем маленький Оруэллиан, видит, как PHP распознает и отклоняет желаемый тип на одном дыхании. Есть пять огней, черт побери.
Что эквивалентно типу хинтинга для строк в PHP? Бонус за рассмотрение ответа, который точно объясняет, что здесь происходит.
php
types
type-hinting
leepowers
источник
источник
Ответы:
До PHP 7 хинтинг типов можно использовать только для принудительного использования типов объектов и массивов. Скалярные типы не являются Hin-Hintable. В этом случае
string
ожидается объект класса , но вы даете ему (скаляр)string
. Сообщение об ошибке может быть забавным, но оно не должно работать с самого начала. Учитывая динамическую систему типирования, это действительно имеет какой-то извращенный смысл.Вы можете только вручную «ввести подсказку» скалярных типов:
источник
Из руководства PHP :
Итак, у вас есть это. Сообщение об ошибке не очень полезно, но я дам вам это.
** 2017 Редактировать **
В PHP7 появилось больше объявлений типов данных функций, и вышеупомянутая ссылка была перемещена в Аргументы функций: Объявления типов . С этой страницы:
Последнее предупреждение действительно важно для понимания ошибки "Аргумент должен иметь тип string, string string"; поскольку в качестве типа аргумента в основном разрешены только имена классов / интерфейсов, PHP пытается найти имя класса «string», но не может найти ни одного, потому что это примитивный тип, поэтому происходит сбой с этой неловкой ошибкой.
источник
PHP позволяет намекать, где вы указываете класс для указания объекта. Согласно руководству по PHP, «подсказки типов могут быть только объектного и массивного типа (начиная с PHP 5.1). Подсказки традиционного типа с использованием int и string не поддерживаются». Ошибка сбивает с толку из-за вашего выбора «string» - поставьте «myClass» на место, и ошибка будет выглядеть по-другому: «Аргумент 1, передаваемый в phpwtf (), должен быть экземпляром myClass, данная строка»
источник
Как уже говорили другие, подсказки типов в настоящее время работают только для типов объектов. Но я думаю, что конкретная ошибка, которую вы вызвали, может быть связана с подготовкой следующего типа строки SplString .
Теоретически он ведет себя как строка, но, поскольку он является объектом, он проходит проверку типа объекта. К сожалению, это еще не в PHP 5.3, может появиться в 5.4, поэтому не проверял это.
источник
В РНР 7.0 объявления типа позволяют скалярные типы, так что эти типы теперь доступны:
self
,array
,callable
,bool
,float
,int
,string
. Первые три были доступны в PHP 5, но последние четыре являются новыми в PHP 7. Если вы используете что-то еще (например,integer
илиboolean
), это будет интерпретироваться как имя класса.Смотрите руководство по PHP для получения дополнительной информации .
источник
Может быть, не безопасно и красиво, но если вам нужно:
источник
new string(array(1,2,3))
Я получил эту ошибку при вызове функции из контроллера Laravel в файл PHP.
Через пару часов я обнаружил проблему: я использовал $ this из статической функции.
источник
Using $this when not in object context
действительно загадочное сообщение.(первоначально опубликовано leepowers в его вопросе)
Сообщение об ошибке сбивает с толку по одной большой причине:
Имена примитивных типов не зарезервированы в PHP
Ниже приведены все допустимые объявления классов:
Моя ошибка заключалась в том, что я думал, что сообщение об ошибке относится только к строковому примитиву - слово «экземпляр» должно было дать мне паузу. Пример для иллюстрации далее:
Вывод:
В PHP возможно
string
быть a,string
за исключением случаев, когда это на самом делеstring
. Как и в любом языке, который использует неявное преобразование типов, контекст - это все.источник
Я думаю, что приведение типов на php внутри блока, String на PHP не объект, как я знаю:
источник
(string) $s
может выдать ошибку, если$s
объект не может быть преобразован в строку (__toString()
метод не реализован), так что это не так просто