Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   PHP, PERL, MySQL, JavaScript (https://forum.antichat.xyz/forumdisplay.php?f=37)
-   -   Не может найти константу в функции (https://forum.antichat.xyz/showthread.php?t=73047)

serg-php 08.06.2008 11:04

Не может найти константу в функции
 
Имеется функция:

Код:

function hwGetExtraOptions( )
{
        global $db;
        static $A_RES = NULL;
        if ( isset( $A_RES ) )
        {
                return $A_RES;
        }
        $sql = "";
        $a_v = array_keys( hwgetextraoptionids( ) );
        foreach ( $a_v as $k )
        {
                if ( defined( "ADMIN_AREA" ) || constant( "EN_AD_{$k}" ) )
                {
                        $sql .= ",'{$k}'";
                }
        }
        $A_RES = array( );
        if ( !$sql )
        {
                return $A_RES;
        }
        $a_v = $db->select( "SELECT * FROM ".TBL_EXTRA_OPT." WHERE type IN(".substr( $sql, 1 ).") AND active=\"1\" ORDER BY type,price" );
        if ( hwismodeventallowed( "onExtraOptionsGet" ) )
        {
                $args = array(
                        "A_EXTRA" => $a_v
                );
                hwmodevent( "onExtraOptionsGet", &$args );
                $a_v = $args['A_EXTRA'];
        }
        if ( $a_v )
        {
                $A_TRAN = hwlangphrase( );
                if ( $A_TRAN )
                {
                        foreach ( $a_v as $k => $v )
                        {
                                if ( $A_TRAN["ex_opt-{$v['id']}"] )
                                {
                                        $a_v[$k]['descr'] = $A_TRAN["ex_opt-{$v['id']}"];
                                }
                        }
                }
        }
        $a_v[] = false;
        $a_fee = $a_descr = array( );
        foreach ( $a_v as $v )
        {
                if ( isset( $p_v['type'] ) && $p_v['type'] != $v['type'] )
                {
                        $id = "AD_{$p_v['type']}";
                        $A_RES[$id] = array(
                                "ID" => $id,
                                "NAME" => "{ex_".$p_v['type']."}",
                                "INPUT" => "menu",
                                "EN_ORD" => 1,
                                "DT" => EX_OPT_EXP * 86400,
                                "FEE" => $a_fee,
                                "DESCR" => $a_descr
                        );
                        $a_fee = $a_descr = array( );
                }
                $p_v = $v;
                $a_fee[$v['val']] = $v['price'];
                $a_descr[$v['val']] = $v['descr'];
        }
        return $A_RES;
}


Получаю сообщение об ошибке:

Цитата:

Warning: constant() [function.constant]: Couldn't find constant EN_AD_0 in Y:\home\localhost\www\mysite\inc\lib.inc.php on line 2134

Warning: constant() [function.constant]: Couldn't find constant EN_AD_1 in Y:\home\localhost\www\mysite\inc\lib.inc.php on line 2134

Warning: constant() [function.constant]: Couldn't find constant EN_AD_2 in Y:\home\localhost\www\mysite\inc\lib.inc.php on line 2134

Warning: constant() [function.constant]: Couldn't find constant EN_AD_3 in Y:\home\localhost\www\mysite\inc\lib.inc.php on line 2134

Проблема в строке:

Код:

if ( defined( "ADMIN_AREA" ) || constant( "EN_AD_{$k}" ) )

Какие будут соображения по устранению?

etc 08.06.2008 11:20

А они вообще задефинены? Если нет то все правильно :)

serg-php 08.06.2008 11:28

Цитата:

задефинены

Ругается на это место:
Цитата:

constant( "EN_AD_{$k}" )
Мне непонятны слова:
Цитата:

Couldn't find constant EN_AD_0
?

NOmeR1 08.06.2008 11:51

попробуй что-ли так
Код:

if ( defined( "ADMIN_AREA" ) || @constant( "EN_AD_{$k}" ) )

etc 08.06.2008 11:56

Если они задефинены, то странновато это :)
Да и зачем используется такая конструкция?
Цитата:

constant() will return the value of the constant indicated by name.

NOmeR1 08.06.2008 12:00

Ну так поэтому в операторе If оно и используется. Я дал вариант, чтоб не выдавалась ошибка, если константа не задефинена.

etc, а как по-другому в названии константы ты будешь использовать $k?

etc 08.06.2008 12:32

Что если применить тот же defined ?
Цитата:

if ( defined( "ADMIN_AREA" ) || defined( "EN_AD_" . $k) )

NOmeR1 08.06.2008 12:51

Смотри. К примеру дано такое:
Код:

        define("CONST_ONE", 0);
        define("CONST_TWO", 1);

Следи что вернут эти выражения:
Код:

        var_dump(defined("CONST_ONE"));
        var_dump(defined("CONST_TWO"));

Тут везде bool(true), поэтому выражения выполнятся если задефинено.
Далее пробуем
Код:

        var_dump((bool)constant("CONST_ONE"));
        var_dump((bool)constant("CONST_TWO"));

Здесь уже в первом случае bool(false), потому что при значение равном нулю (либо пустому значения) константы, выражение не выполнится.
Ну а последняя строчка вернёт bool(true) и выражение выполнится, так как значение константы положительно.

etc 08.06.2008 13:12

в случае нуля с моим примером можно вообще не дефинить :)

Isis 08.06.2008 14:40

NOmeR1, ошибки надо не скрывать, а исправлять :)


Время: 02:50