PDA

Просмотр полной версии : Не может найти константу в функции


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, ошибки надо не скрывать, а исправлять :)

NOmeR1
08.06.2008, 17:19
Решение - задефинить константы en_ad_0, en_ad_1, en_ad_2, en_ad_3. Какими значениями - не знаю, т.к. какую роль эти константы играют - не написано.

serg-php
08.06.2008, 20:19
NOmeR1,

наверное, ты прав.
поставил
if ( defined( "ADMIN_AREA" ) || @constant( "EN_AD_{$k}" ) )

Теперь сообщений нет!
Благодарю за помощь!

etc
08.06.2008, 20:27
Учти, что это лишь способ убрать предупреждения, но не решить проблему. :) В твоем случае получается что второе условие вообще не работает.

Arrest
08.06.2008, 23:11
if ( defined( "ADMIN_AREA" ) || ( defined( "EN_AD_".$k ) && constant( "EN_AD_".$k ) )) // может быть использовать ., И и defined?

Isis
09.06.2008, 02:01
NOmeR1, нельзя новичкам да и вообще никому писать посты как #4, потому что этим самым ты учишь скрывать ошибки, а как я сказал, их надо исправлять...
Пост #12 сделал вывод =(

NOmeR1
09.06.2008, 02:23
Ой ну чего ты приепался? Только что повторил свой предыдущий пост в этой теме.
Вообще, я дал вполне логичный выход. Я на примере объяснил в посте #8.

Если не задефинена константа, то условие @constant( "EN_AD_{$k}" ) вернёт false, то же самое что и если бы константа была задефинена и значение у неё было нулевое.
В операторе IF так же используется условие defined( "ADMIN_AREA" ) - а это скорее всего значит, что константа ADMIN_AREA может быть задефинена, либо нет. Поэтому я считаю, что и константы EN_AD_0, EN_AD_1, EN_AD_2, EN_AD_3 тоже могут быть не задефинены, а это как раз и создаёт ошибки!