Константы PHP не определены - но они определены! - PullRequest
3 голосов
/ 09 июля 2010

Я использую константы для установки различных переменных конфигурации в скрипте.

Константа INC_PATH определяется в скрипте, который включает библиотеку классов.

define('INC_PATH',$_SERVER['DOCUMENT_ROOT'].'includes/');
include('class.lib.php');

Библиотека классов содержит различные строки include ('someClass.php').Он также содержит:

require(INC_PATH.'DB.class.php');

Библиотека классов выдает уведомление:

Use of undefined constant INC_PATH - assumed 'INC_PATH'

Как библиотека классов не может увидеть, что константа INC_PATH была определена?Я думал, что константы были глобальными?

Ответы [ 5 ]

8 голосов
/ 09 июля 2010

Да, но они должны быть определены раньше:

<?php
echo INC_PATH; //undefined
define('INC_PATH', "foo");
echo INC_PATH; //defined

В ответ на ваш комментарий

Я не могу воспроизвести это:

a.php

<?php
define('INC_PATH',$_SERVER['DOCUMENT_ROOT']."/");
include('b.php.inc');

b.php.inc

<h1><?php require(INC_PATH . "c.php.inc"); ?></h1>

c.php.inc

<?php echo INC_PATH; ?>

Запрос a.php дает:

<h1>U:/htdocs/</h1>
0 голосов
/ 24 июля 2010

Возможно вы пишете код

define('INC_PATH',$_SERVER['DOCUMENT_ROOT'].'includes/');
include('class.lib.php');

внутри блока.


Если вы напишите свой код в каком-либо блоке, если блок не выполняется, то объявленные в блоке переменные или константы не будут инициализированы.

Предположим, вы делаете код, подобный этому,

<?php
  $var = false;
  // This if block will not execute
  if($var) // because if($var) will be executed as if(false)
  {
    define('TEST_CONST', 'This is a test');
  }
  echo TEST_CONST;
?>

Он выдаст такой результат:

Notice: Use of undefined constant TEST_CONST - assumed 'TEST_CONST' in C:\www\test2.php on line 7
TEST_CONST

Исправьте это, чтобы решить вашу проблему.

0 голосов
/ 23 июля 2010

Возможно ли, что вызванный define() находится в блоке кода, который не выполняется, как оператор if()?

Что вы получите, если проверите значение INC_PATH непосредственно перед включением class.lib.php?

...
...
var_dump(INC_PATH);exit;
include('class.lib.php');
0 голосов
/ 10 июля 2010

Дикая догадка (хотя стоит проверить): это уведомление может появиться, если ваша строка

include('class.lib.php');

вызывается когда-то до объявления константы INC_PATH .


Измените файл библиотеки классов и проверьте, кто на самом деле включает этот файл:

throw new Exception('err'); //-- Verify the stack trace !
require(INC_PATH.'DB.class.php');
0 голосов
/ 09 июля 2010

Вы уверены, что это именно проблема?Это сообщение об ошибке может отображаться при доступе к значениям массива без кавычек для ключей:

$array[value]
// instead of:
$array['value']

Добавленные одинарные кавычки в вашем сообщении об ошибке являются индикатором, кавычки не будут добавлены к константе.

...