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

Discussion in 'PHP' started by serg-php, 8 Jun 2008.

  1. serg-php

    serg-php Elder - Старейшина

    Joined:
    28 Jan 2008
    Messages:
    313
    Likes Received:
    9
    Reputations:
    0
    Имеется функция:

    Code:
    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;
    }

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


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

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

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

    etc Elder - Старейшина

    Joined:
    16 Feb 2008
    Messages:
    113
    Likes Received:
    175
    Reputations:
    1
    А они вообще задефинены? Если нет то все правильно :)
     
  3. serg-php

    serg-php Elder - Старейшина

    Joined:
    28 Jan 2008
    Messages:
    313
    Likes Received:
    9
    Reputations:
    0

    Ругается на это место:
    Мне непонятны слова:
    ?
     
  4. NOmeR1

    NOmeR1 Everybody lies

    Joined:
    2 Jun 2006
    Messages:
    1,068
    Likes Received:
    783
    Reputations:
    213
    попробуй что-ли так
    Code:
    if ( defined( "ADMIN_AREA" ) || @constant( "EN_AD_{$k}" ) )
     
  5. etc

    etc Elder - Старейшина

    Joined:
    16 Feb 2008
    Messages:
    113
    Likes Received:
    175
    Reputations:
    1
    Если они задефинены, то странновато это :)
    Да и зачем используется такая конструкция?
     
  6. NOmeR1

    NOmeR1 Everybody lies

    Joined:
    2 Jun 2006
    Messages:
    1,068
    Likes Received:
    783
    Reputations:
    213
    Ну так поэтому в операторе If оно и используется. Я дал вариант, чтоб не выдавалась ошибка, если константа не задефинена.

    etc, а как по-другому в названии константы ты будешь использовать $k?
     
    #6 NOmeR1, 8 Jun 2008
    Last edited: 8 Jun 2008
  7. etc

    etc Elder - Старейшина

    Joined:
    16 Feb 2008
    Messages:
    113
    Likes Received:
    175
    Reputations:
    1
    Что если применить тот же defined ?
     
  8. NOmeR1

    NOmeR1 Everybody lies

    Joined:
    2 Jun 2006
    Messages:
    1,068
    Likes Received:
    783
    Reputations:
    213
    Смотри. К примеру дано такое:
    Code:
    	define("CONST_ONE", 0);
    	define("CONST_TWO", 1);
    
    Следи что вернут эти выражения:
    Code:
    	var_dump(defined("CONST_ONE"));
    	var_dump(defined("CONST_TWO"));
    
    Тут везде bool(true), поэтому выражения выполнятся если задефинено.
    Далее пробуем
    Code:
    	var_dump((bool)constant("CONST_ONE"));
    	var_dump((bool)constant("CONST_TWO"));
    
    Здесь уже в первом случае bool(false), потому что при значение равном нулю (либо пустому значения) константы, выражение не выполнится.
    Ну а последняя строчка вернёт bool(true) и выражение выполнится, так как значение константы положительно.
     
    #8 NOmeR1, 8 Jun 2008
    Last edited: 8 Jun 2008
    1 person likes this.
  9. etc

    etc Elder - Старейшина

    Joined:
    16 Feb 2008
    Messages:
    113
    Likes Received:
    175
    Reputations:
    1
    в случае нуля с моим примером можно вообще не дефинить :)
     
  10. banned

    banned Banned

    Joined:
    20 Nov 2006
    Messages:
    3,324
    Likes Received:
    1,193
    Reputations:
    252
    NOmeR1, ошибки надо не скрывать, а исправлять :)
     
    2 people like this.
  11. NOmeR1

    NOmeR1 Everybody lies

    Joined:
    2 Jun 2006
    Messages:
    1,068
    Likes Received:
    783
    Reputations:
    213
    Решение - задефинить константы en_ad_0, en_ad_1, en_ad_2, en_ad_3. Какими значениями - не знаю, т.к. какую роль эти константы играют - не написано.
     
  12. serg-php

    serg-php Elder - Старейшина

    Joined:
    28 Jan 2008
    Messages:
    313
    Likes Received:
    9
    Reputations:
    0
    NOmeR1,

    наверное, ты прав.
    поставил
    Code:
    if ( defined( "ADMIN_AREA" ) || @constant( "EN_AD_{$k}" ) )
    Теперь сообщений нет!
    Благодарю за помощь!
     
  13. etc

    etc Elder - Старейшина

    Joined:
    16 Feb 2008
    Messages:
    113
    Likes Received:
    175
    Reputations:
    1
    Учти, что это лишь способ убрать предупреждения, но не решить проблему. :) В твоем случае получается что второе условие вообще не работает.
     
  14. Arrest

    Arrest New Member

    Joined:
    6 Jun 2008
    Messages:
    5
    Likes Received:
    3
    Reputations:
    3
    PHP:
    if ( defined"ADMIN_AREA" ) || ( defined"EN_AD_".$k ) && constant"EN_AD_".$k ) )) // может быть использовать ., И и defined?
     
    #14 Arrest, 8 Jun 2008
    Last edited: 8 Jun 2008
  15. banned

    banned Banned

    Joined:
    20 Nov 2006
    Messages:
    3,324
    Likes Received:
    1,193
    Reputations:
    252
    NOmeR1, нельзя новичкам да и вообще никому писать посты как #4, потому что этим самым ты учишь скрывать ошибки, а как я сказал, их надо исправлять...
    Пост #12 сделал вывод =(
     
  16. NOmeR1

    NOmeR1 Everybody lies

    Joined:
    2 Jun 2006
    Messages:
    1,068
    Likes Received:
    783
    Reputations:
    213
    Ой ну чего ты приепался? Только что повторил свой предыдущий пост в этой теме.
    Вообще, я дал вполне логичный выход. Я на примере объяснил в посте #8.

    Если не задефинена константа, то условие @constant( "EN_AD_{$k}" ) вернёт false, то же самое что и если бы константа была задефинена и значение у неё было нулевое.
    В операторе IF так же используется условие defined( "ADMIN_AREA" ) - а это скорее всего значит, что константа ADMIN_AREA может быть задефинена, либо нет. Поэтому я считаю, что и константы EN_AD_0, EN_AD_1, EN_AD_2, EN_AD_3 тоже могут быть не задефинены, а это как раз и создаёт ошибки!
     
    2 people like this.
Loading...
Similar Threads - найти константу функции
  1. GAiN
    Replies:
    4
    Views:
    6,911