Вероятно, лучшая практика в PHP - использовать подробные ассоциативные массивы и строковые утверждения только с небольшими издержками, когда утверждения отключены в производственных системах или в PHP7 даже ожидания с нулем Стоимость. Это раздражает при написании кода, но читается в последующих обзорах кода, а также обнаруживает ошибки при тестировании кода во время разработки.
Просто чтобы показать пример:
php.ini
zend.assertions = 1
assert.warning = 1
assert.exception = 1
assert.bail = 1
PHP
function foobar(array $config)
{
assert
(
(function($keys_allowed, $keys_expected)use($config)
{
// do not stop execution until all issues are output
$opt_expt = assert_options(ASSERT_EXCEPTION, 0);
$opt_bail = assert_options(ASSERT_BAIL , 0);
$ok = 1;
$ok &= assert( empty( $diff = array_diff_key(array_fill_keys($keys_expected, 1), $config) ),
new AssertionError('Missing mandatory keys: (' . join(', ', array_keys($diff)) . ')'));
$ok &= assert( empty( $diff = array_diff_key($config, $keys_allowed) ),
new AssertionError('Disallowed keys: (' . join(', ', array_keys($diff)) . ')'));
$ok &= assert( empty( $diff = array_filter
( $config,
function($v, $k)use($keys_allowed)
{
return isset($keys_allowed[$k]) && $keys_allowed[$k] !== gettype($v);
},
ARRAY_FILTER_USE_BOTH)
),
new AssertionError('Type error on items: (' . join(', ', array_keys($diff)) . ')'));
//restore configured behaviour
assert_options(ASSERT_EXCEPTION, $opt_expt);
assert_options(ASSERT_BAIL , $opt_bail);
return $ok;
})
(
[ 'foo' => 'string', 'bar' => 'integer', 'baz' => 'boolean' ], [ 'baz' ]
)
, new AssertionError('Arguments assertion in function `' . __FUNCTION__ . '` failed.')
);
// foobar function stuff
echo 'Ok!', PHP_EOL;
}
// test
foobar(['foo' => '1', 'baz' => true ] ); // Ok!
foobar([ 'bar' => 1 , 'baz' => true ] ); // Ok!
foobar(['foo' => 1 , 'baz' => true ] ); // Warning: type ; Fatal error
foobar(['foo' => '1', 'bar' => 1 ] ); // Warning: missing ; Fatal error
foobar(['foo' => 1 , 'bar' => '1' , 'forbidden' => 'x'] ); // Warnings: missing, disallowed, type ; Fatal error
Внешнее утверждение генерирует фатальную ошибку, останавливая выполнение, в то время как внутреннее утверждение генерирует непрерывные предупреждения.
Вы можете легко преобразовать анонимную функцию в именованную функцию, используя использованную переменную в качестве дополнительного параметра.