【问题标题】:Does PHP have an equivalent of C/C++'s #ifdef?PHP 是否具有与 C/C++ 的 #ifdef 等效的功能?
【发布时间】:2012-03-21 06:27:53
【问题描述】:

我正在尝试定义一个常量,但如果它已经定义,我不想重新定义它。 这是一个 C 示例:

#ifndef BASEPATH
#define BASEPATH /mnt/www
#endif

在 PHP 中最优雅的方法是什么?

【问题讨论】:

  • 从技术上讲,不,因为 PHP 的 define / definedruntime 进行评估(PHP 定义几乎与变量相同),并且没有(内置) 预处理器,它能够在不评估其语法正确性的情况下禁用一堆代码(例如,使用 PHP 的 if(defined(...)) 禁用语法错误的代码将无济于事)。

标签: php constants


【解决方案1】:

在 C 中,#ifdef 通常涉及根据定义是否存在来编写/启用/禁用自定义代码。尽管 OP 并没有寻找随后的答案,但搜索引擎用户可能有兴趣获得扩展的答案。 (这个问题帮助我 RTM 找到了下面的答案。)

如果一个 .php 文件被多次包含,那么只有在同一个文件的先前包含尚未声明该函数时,才可以方便地声明一个函数。在这种情况下,方便的是将紧密相关的代码保存在同一个文件中,而不必将其放在单独的 include_once .php 文件中,以及不必要地分开通常不打算在其他上下文中重复使用的代码(文件)。

由于多次重新声明函数似乎很浪费/不恰当,事实证明在 PHP 中类似 #ifdef 的构造是可能的:

if (! function_exists('myfunc'))
{
  function myfunc(...)
  {
    ...
  }
}

... 表示您的填空。

另请参阅:function_exists (PHP 4, PHP 5)(带 cmets)。

【讨论】:

  • 似乎全局变量在 myfunc() 中是不可见的,因此必须将引用作为参数传入(根据需要)。
  • 是的,我在 if 语句的末尾有一个分号(现在它已经消失了),但答案正文中清楚地描述了 ...。该代码是真实网站上某些内容的复制/粘贴,只是我用... 替换了参数和函数体并更改了函数名称。
  • 我什至没有提到草图没有意义:“如果一个函数不存在 - 用另一个名称定义一个函数”:-S
  • 这不是校对,而是针对您的问题。好吧,这仍然与问题完全无关。
  • 您是想说搜索“php”“ifdef”的人不会觉得这有帮助,还是说人们不应该因为答案不完全合适而回答问题问题的详细文本。这个问题是我解决有条件声明函数问题的关键。扩展答案以帮助更多寻求者似乎很周到。
【解决方案2】:

这是对上述 Radu 答案(以及其他所有人的答案)的精简重写。

defined('BASE_PATH') || define('BASE_PATH', '/mnt/www/');    

就是这样。如果 defined('BASE_PATH') 评估为 true,则条件的其余部分永远不会被评估。如果它返回 false,则评估条件的后半部分并定义 BASE_PATH

【讨论】:

  • 我推荐更长的版本,即使在一行上,因为从长远来看,增加的可读性将是有益的...if (!defined('BASE_PATH')) define('BASE_PATH', '/mnt/www/'); 仅比 3 个字符长这个精简版,它在可读性方面弥补了它的不足。
【解决方案3】:

使用defined():

<?php
/* Note the use of quotes, this is important.  This example is checking
 * if the string 'TEST' is the name of a constant named TEST */
if (defined('TEST')) {
    echo TEST;
}
?>

【讨论】:

    【解决方案4】:
    if(!defined('BASEPATH')) {
        define('BASEPATH', '/mnt/www');
    }
    

    http://us3.php.net/manual/en/function.defined.php

    【讨论】:

      【解决方案5】:

      使用defined()函数

      if(!defined("constantname")) {
         define("constantname", "value");
      }
      

      【讨论】:

        【解决方案6】:

        使用defined()define()

        if (!defined('BASEPATH')) {
            define('BASEPATH', '/mnt/www');
        }
        

        【讨论】:

        • 不错!我已经确定的是(全部在一行中):defined('BASE_PATH') || define('BASE_PATH', '/mnt/www/'); 如果defined()true,则条件的其余部分永远不会被评估,如果defined() 返回false ,条件的后半部分被评估并定义BASE_PATH
        猜你喜欢
        • 2011-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-11
        • 2011-11-27
        • 1970-01-01
        • 2011-02-28
        • 1970-01-01
        相关资源
        最近更新 更多