В настоящее время я работаю над фреймворком и приступил к сбою ... как я должен обрабатывать неправильные типы параметров, когда кто-то вызывает функцию в рамках?PHP function param type best practices
Пример:
// Title is expected to be string, comment_num is expected to be int
function example1($title, $comment_num) {
// Doesnt throw error, just converts type
$title = (string) $title;
$comment_num = (int) $comment_num;
}
или
// Title is expected to be string, comment_num is expected to be int
function example2($title, $comment_num) {
if (!is_string($title)) {
trigger_error('String expected for first parameter', E_USER_WARNING);
return;
}
if (!is_string($title)) {
trigger_error('Int expected for second parameter', E_USER_WARNING);
return
}
}
Или бы смесь обоих работы? Выбросить ошибку и преобразовать тип в любом случае?
Что было бы лучшим способом сделать это? Я планирую выпустить его, поэтому я не просто использую его, поэтому я хочу думать о лучшем для других. Благодарю.
EDIT !!!
Так что я решил дать ответ, но я также хотел опубликовать код, который я сделал, что позволяет мне быстро проверять типы. Его abit грубо, но он работает достаточно хорошо.
function __type_check($params) {
if (count($params) < 1) {
return;
}
$types = func_get_args();
array_shift($types);
$backtrace = debug_backtrace();
$backtrace = $backtrace[1];
$global_types = array(
'bool' => 'boolean',
'int' => 'integer',
'float' => 'double'
);
$error = false;
for ($i = 0, $j = count($types); $i < $j; ++$i) {
if (strpos($types[$i], ',') === false) {
$type = strtolower($types[$i]);
if (isset($global_types[$type])) {
$type = $global_types[$type];
}
if (gettype($params[$i]) != $type) {
$error = true;
break;
}
} else {
$current_types = array_map('trim', explode(',', $types[$i]));
foreach ($current_types as $type) {
$type = strtolower($type);
if (isset($global_types[$type])) {
$type = $global_types[$type];
}
if (gettype($params[$i]) == $type) {
continue 2;
}
}
$error = true;
break;
}
}
if ($error) {
trigger_error($backtrace['function'] . '() expects parameter ' . ($i + 1) . ' to be ' . $types[$i] . ', ' . gettype($params[$i]) . ' given', E_USER_WARNING);
return false;
}
return true;
}
И вы бы использовать его как это:
function string_manipulation($str, $str2, $offset = 1) {
if (!__type_check(func_get_args(), 'string', 'string', 'int,float')) {
return false;
}
// do manipulation here
}
Это был в основном проверить, что первые и вторые параметрами являются строками, а третий параметр представляет собой целое число или число с плавающей точкой. Вы можете объединить «строку, INT, массив, объект» и т.д. любых типов и все допустимые типы взяты из GetType
/* Известные ошибки */ нуля типа, не может решить, должен ли он быть или не если вы вводите имя класса, он не проверяет экземпляр, но только делает typecheck нету выяснили хороший способ, чтобы вызвать ошибку ... Мех
Вот это от меня, ошибки можно легко исправить: D
Мое предложение: не используйте 'trigger_error'. Выбросьте исключения. Они намного гибче и легче справляются с этим. – ircmaxell
исключение для чего-то такого же тривиального, как тип данных, кажется, похоже на то, что ... вы не можете действительно ожидать, что люди будут запускать каждую функцию в try/catch. – Ozzy
Не отвечая на ваш вопрос здесь, но если вы создаете фреймворк, лучше создать единую функцию, которая выполняет проверки для вас, а ваши другие функции/классы относятся к этой единственной функции. – Duniyadnd