[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Проверка типов аргументов функций и методов
dancedance
Стандартные функции и методы принимая значения проверяют их тип, хотелось бы что-то подобное сделать и в самописных т.е. что-то вроде function fname( integer $arg, string $arg2 ) {}
Это как-то возможно? если нет, то посоветуй красивую реализацию данной проверки. Вообще хотелось бы обзавестись красивым методом валидации аргументов самописных методов, но пока ничего сам не придумал sad.gif
Invis1ble
в PHP есть type hinting, правда работает только для массивов и объектов
function fname(array $args, $arg2 ) {
if (!is_string($arg2))
throw new Exception(...);
}


_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

dancedance
Invis1ble > спасибо, был уверен что существует, но никак не мог нагуглить.
Может кому пригодится http://php.net/manual/ru/language.oop5.typehinting.php
В комментах есть решение позволяющее обойти данное ограничение(правда пока не тестил, завтра опробую и отпишусь):

<?php

define( 'TYPEHINT_PCRE' ,'/^Argument (\d)+ passed to (?:(\w+)::)?(\w+)\(\) must be an instance of (\w+), (\w+) given/' );

class Typehint
{

private static $Typehints = array(
'boolean' => 'is_bool',
'integer' => 'is_int',
'float' => 'is_float',
'string' => 'is_string',
'resrouce' => 'is_resource'
);

private function __construct() {}

public static function initializeHandler()
{
set_error_handler('Typehint::handleTypehint');
return TRUE;
}

private static function getTypehintedArgument( $ThBackTrace, $ThFunction, $ThArgIndex, &$ThArgValue )
{
foreach( $ThBackTrace as $ThTrace )
{
if( isset($ThTrace['function']) && $ThTrace['function'] == $ThFunction )
{
$ThArgValue = $ThTrace['args'][$ThArgIndex - 1];
return TRUE;
};
};
return FALSE;
}

public static function handleTypehint( $ErrLevel, $ErrMessage )
{
if( $ErrLevel == E_RECOVERABLE_ERROR )
{
if( preg_match( TYPEHINT_PCRE, $ErrMessage, $ErrMatches ) )
{
list( $ErrMatch, $ThArgIndex, $ThClass, $ThFunction, $ThHint, $ThType ) = $ErrMatches;
if( isset( self::$Typehints[$ThHint] ) )
{
$ThBacktrace = debug_backtrace();
$ThArgValue = NULL;
if( self::getTypehintedArgument( $ThBacktrace, $ThFunction, $ThArgIndex, $ThArgValue ) )
{
if( call_user_func( self::$Typehints[$ThHint], $ThArgValue ) )
{
return TRUE;
};
};
};
};
};
return FALSE;
}
}


Typehint::initializeHandler();

function test( string $arg1, integer $arg2 ) { echo $arg1; }
//function testinteger(integer $integer) { echo $integer; }
//function testfloat(float $float) { echo $float; }


test('test1', 123);
test('test2','test');
?>
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.