Re: [PHP] Типобезопасность констант
От: piksel Россия  
Дата: 20.10.09 03:41
Оценка: +1
Здравствуйте, 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 и массе других языков, по-моему она называется динамической .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.