【问题标题】:Dynamic (Shell Exec) Defined Constant via Function in PHP通过 PHP 中的函数动态(Shell Exec)定义常量
【发布时间】:2019-05-02 03:15:11
【问题描述】:

过去一个小时我只是在研究这个,试图找出最好的方法。

我正在开发一个 PHP CLI 应用程序,它使用以下函数来查找命令行宽度。

function getColLen() {
    $getcolLen = shell_exec('tput cols');
    $colLen = (int) $getcolLen;
    return $colLen; 
}

现在,我正在使用大约 8 个类,并且我经常使用这个函数——在大多数类和类中的许多方法中。

以前它只是包含在作曲家供应商自动加载functions.php 文件中,我在每个函数中初始化它,比如

public function Tagger()
    {
$colwidth = getColLen();

. . . . . 

等等

我研究了许多在 PHP 类中使用动态全局变量的不同选项,其中有很多,有些变得相当复杂。

为了好玩,我决定尝试将其添加到我的 functions.php 文件中的 CONSTANT

define('CLIWIDTH', getColLen());

我认为这行不通,因为我阅读的所有信息(以及我看到的所有示例)都是关于定义静态变量(例如字符串或目录)的。

但令我惊讶的是,这工作得非常好。一个简单的echo CLIWIDTH; 任何地方都会带来命令行宽度(在以不同大小启动控制台时,针对不同输出进行了成功测试)。

这不是被广泛认为是在所有文件中创建动态变量的正确方法吗?也许我没有搜索正确的术语,但我从未听说过有人在诸如此类的已定义常量内使用函数。

这是正确的代码吗?在讨论常量、全局变量等时,是否有理由不推荐这样做?

【问题讨论】:

  • define() 的第二个参数没有限制。

标签: php class oop command-line-interface constants


【解决方案1】:

define() 的 value 参数可以是什么没有限制,并且常量将被定义为具有该表达式的任何内容。虽然它主要用于为文字命名,例如数据库配置设置,但它并非必须如此。您可以在那里放置一个动态表达式,例如

define("DB_USER", $hostname == "dev" ? "devuser" : "produser");

【讨论】:

  • 非常酷,我在学习如何从其他来源定义常量时不知道。不确定是不是首选还是什么!老实说,动态全局范围内的某些东西似乎是一个不错的选择(..如果每个特定实例的动态都相同。)
  • 这正是define 的用途,用于创建全局范围的名称。该值是简单的文字还是计算的无关紧要。与普通变量不同的是,一旦定义了就无法更改。
【解决方案2】:

这是有效的 PHP,但它与每次调用函数不同(除非函数总是返回相同的结果)。基本上,当遇到define 时会调用该函数,并将该返回值分配给常量。考虑:

function getv() {
    static $v = 4;
    return $v++;
}

define('V', getv());
echo V . PHP_EOL;
echo getv() . PHP_EOL;
echo V . PHP_EOL;

输出:

4
5
4

注意常量V总是输出4,即使getv的返回值变为5。

Demo on 3v4l.org

【讨论】:

  • 抱歉一直在编辑,我想出了一个更好的例子……
  • 有道理,感谢您提供的信息和示例!我也喜欢你的编辑,当弄乱你的演示链接时,我做了完全相同的事情来回显 V 两次以理解然后注意到你完全按照这样的方式进行了编辑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多