【问题标题】:PHP constants undefined - but they are defined!PHP 常量未定义 - 但它们已定义!
【发布时间】:2010-07-09 11:24:39
【问题描述】:

我正在使用常量在脚本中设置各种配置变量。

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 常量已被定义?我认为常量是全局的?

【问题讨论】:

  • 你确定它确实是include('class.lib.php'); 而不是include('http://example.com/class.lib.php'); 吗?
  • @Col。弹片 不是,但如果是,那会有什么不同呢?是否会导致未定义常量?这似乎没有意义。
  • 哦,但这确实有道理。在后一种情况下,您包含脚本的解释版本,它不会知道您在包含它时定义的任何常量,因为它在不同的请求(从服务器启动)中自行运行。
  • @wimvds 那么在没有不同请求的情况下如何让它运行呢?脚本后面还有其他包含的文件,它们使用各种常量没有问题。它们是如何工作的,而这个却没有?
  • 你可以试试get_defined_constants()看内容是否和你调用栈的schema一致?...

标签: php constants


【解决方案1】:

是的,但它们必须在之前定义:

<?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>

【讨论】:

  • 它是之前定义的 - 如果最初的帖子出现误导,我们深表歉意 - 帖子中的第一行代码位于定义 INC_PATH 之后包含的 class.lib.php 文件中。
  • @bcmcfc:出于好奇,您是否尝试过使用 Artefacto 发布的代码?在我的环境中,我得到的结果与 Artefacto 相同。
  • @bcmcfc - 那么您的代码和@Artefacto 的代码有什么区别?这表明 Artefacto 已经回答了您的问题。
  • 我不明白。出了什么问题?说明问题不可重现的答案如何成为解决方案?
【解决方案2】:

一个疯狂的猜测(虽然值得检查):如果您的线路可能会出现此通知

include('class.lib.php');

INC_PATH常量声明之前之前调用。


修改您的类库文件并验证谁实际包含该文件:

throw new Exception('err'); //-- Verify the stack trace !
require(INC_PATH.'DB.class.php');

【讨论】:

  • 正如我之前所说,常量是在任何地方使用之前定义的。
【解决方案3】:

是否有可能被调用的define() 位于未执行的代码块中,例如if() 语句?

如果在包含class.lib.php 之前立即验证INC_PATH 的值,您会得到什么?

...
...
var_dump(INC_PATH);exit;
include('class.lib.php');

【讨论】:

    【解决方案4】:

    可能是你写的代码

    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
    

    纠正此问题以解决您的问题。

    【讨论】:

      【解决方案5】:

      您确定这正是问题所在吗?在访问不带引号的键的数组值时会显示此错误消息:

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

      您的错误信息中添加的单引号是指示符,不会将引号添加到常量中。

      【讨论】:

      • 我明白了;)但是这个错误消息是由于在应该使用字符串的情况下使用了不存在的常量。
      • 发布的错误确实来自未定义的常量,但并不总是来自忘记字符串的引号。如果您不熟悉常量,它们会非常有用。
      • @bcmcfc:这不是真的,我看到一个数组:$_SERVER... ;) 哈哈哈。
      猜你喜欢
      • 2018-08-27
      • 1970-01-01
      • 1970-01-01
      • 2018-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-29
      相关资源
      最近更新 更多