Здравствуйте, MaxSem, Вы писали:
MS>Дано: функция с переменным числом аргументов, при этом некоторые аргументы могут быть строками, а некоторые — константами, требующими особой обработки.
MS>MS>function foo() {
MS> $params = func_get_args();
MS> foreach( $params as $value) {
MS> if( $value === CONST_1 ) {
MS> ...
MS> } elseif( $value === CONST_2 ) {
MS> ...
MS> } else {
MS> ...
MS> }
MS> }
MS>}
MS>
MS>Проблема в том, что из-за утиной типизации PHP вместо строкового аргумента может быть передано что угодно, так что определения констант вроде define( 'CONST_1', 42 ) могут привести к непредсказуемым последствиям. define( 'CONST_1', 43490543235232.923724023553 ) более надёжно, но выглядит жутким хаком. Что-то вроде define( 'CONST_1', new stdClass() ) могло бы помочь, если бы язык такое позволял.
MS>Можно тут ещё что-то придумать, или придётся прибегать к гораздо более корявым вещам вроде MyClass::const_1()?
Вот когда указано
===, то проверяется именно соответствие значения и
типа, поэтому
define('CONST', 42); // int
define('CONST', 3.1415628); // double
define('CONST', '42'); // char*
и никак иначе.
"Утиная" типизация существует в также в Perl, Python и массе других языков, по-моему она называется динамической
.