Подсказка типа в аргументе функции (magic __call) выдает исключение - PullRequest
1 голос
/ 10 сентября 2011

Это действительно портит мою голову:

Всякий раз, когда я пытаюсь типизировать переменную, переданную функции типа 'string', например:

public function __call( string $name , array $args ) {
    ...
}

Я получаю следующую ошибку:

Исправляемая фатальная ошибка: аргумент 1 передан [ClassName] :: __ call () must быть экземпляром строки, строка, указанная в [php_file_name] в строке [Line_number]

А? "Должен быть экземпляр строки, заданной строки"? Разве я не пропустил строку? Я серьезно не понимаю это сообщение об ошибке.

Теперь мое решение всегда было чем-то вроде:

public function __call( $name , array $args ) {
    if (!is_string($name)) { throw new Exception('$name must be a string');
}

Однако, мой вопрос, есть ли способ на самом деле привести его в определении метода, а не внутри самого метода?

Ответы [ 2 ]

4 голосов
/ 10 сентября 2011

В php вы можете заставить параметры функций быть либо массивом, либо объектом (подсказка типа).Таким образом, ваше действие принимает только «строковые» объекты для первого аргумента, а не переменные типа string.

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

Дополнительная информация здесь: http://www.php.net/manual/en/language.oop5.typehinting.php

И чтобы ответить на ваш вопрос: как правило, вы не можете!

1 голос
/ 10 сентября 2011

PHP не поддерживает скалярные подсказки типов.Только для объектов и массивов.Кто-то из PHP-комментариев написал способ использовать скалярную подсказку типов.Потому что эта ошибка имеет тип catchable fatal error.Вы можете определить свой собственный обработчик ошибок, который позволит вам продолжить работу с этой ошибкой при определенных условиях.

http://www.php.net/manual/de/language.oop5.typehinting.php#83442

Однако, он довольно медленный, и я не рекомендую его использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...