【问题标题】:How to achieve "application scope variables" in php?如何在php中实现“应用程序范围变量”?
【发布时间】:2010-12-26 03:22:10
【问题描述】:

我现在正在开发一个新的 PHP 项目,这次我想从一开始就掌握基础知识。以前我发现在 php 中需要/包含文件有点痛苦,请考虑以下结构:

/application_root/index.php
                 /js/...
                 /css/...
                 /php/...
                 /conf/...
                 ...

在 index.php 中我当然可以使用类似的东西:

<link rel="stylesheet" href="css/sample.css" ... />
<script type="text/javascript" src="js/sample.js"></script>

要引用包含的css和js,甚至是php sn-ps。但是,这只适用于我的应用程序文件夹根目录下的 index.php。我认为这不好。

我遇到了 Java 应用程序配置文件“web.xml”,您可以在其中定义可以简单引用的应用程序范围变量。带有 C# 的 .NET 也有类似的东西。如何在简单的 php 代码中实现这一点,以便从我的应用程序中的任何 php 文件中,我可以输入:

<?php echo "<link href='".$application_root_url."/php/sample.css' ..."; ?>

它会评估到正确的位置吗?

我正在考虑使用:

  • 全局变量
  • set_include_path
  • 从 ini 文件加载变量?
  • 有什么新想法吗?

【问题讨论】:

标签: php global-variables environment-variables


【解决方案1】:

您不想使用全局变量,因为它们会破坏 encapsulation

set_include_path 不会有任何好处,尤其是当您在 HTML 中使用这些变量时,因为 include_path 是相对于应用程序的文件系统路径而不是其基本 url。

确定应用程序的基本路径通常不是从配置文件中完成的,因为很容易检测到您的应用程序何时具有网关脚本。由于这些是常量值,因此定义一个常量是有意义的:

define('APP_ROOT', dirname(__FILE__));
define('APP_URL', dirname($_SERVER['PHP_SELF']));

但是,如果您想解析 INI 文件,可以使用 parse_ini_fileparse_ini_string (>=5.3.0):

$config = parse_ini_file(APP_ROOT.'/'.CONFIG_DIR.'/database.ini');
echo $config['host'];

【讨论】:

    【解决方案2】:

    这里的路径是一个 URI,而不是文件系统位置。无论如何,您可能正在尝试以错误的方式解决此问题。

    【讨论】:

      【解决方案3】:

      你必须使用相对路径。因此,只需将“/css/sample.css”替换为“css/sample.css”即可。

      即使您的 .php 在 yourdomain.com/somefolder/file.php 中,这也总是会从 yourdomain.com/css/sample.css 加载

      【讨论】:

        【解决方案4】:

        PHP 脚本只生成浏览器解释的输出。范围是浏览器中的 URL,而不是文件系统上的 URL。

        所以 $application_root_url 变量的值是针对浏览器的,而不是针对 PHP 脚本的!

        如果要使用INI文件,可以使用PHP的parse_ini_file()函数。

        【讨论】:

          【解决方案5】:
          1. 除了惰性编码之外,没有理由使用全局变量
          2. 效率不高,如果两个相同的文件名在不同的路径上,PHP 将很难确定要包含哪个文件
          3. parse_ini_file 就是你要找的东西

          但是,我更喜欢使用constant,我并没有要求在任何地方都定义常量,只是将所有基本路径放入配置文件中,并在应用程序的开头要求它。

          有些人可能会说常量很慢,比较使用可能需要包含多个文件的类常量,哪个更好?最好的事情是一旦定义了常量,任何人或代码都无法覆盖它。

          举例说明

          define('css_root', '/home/user/apache/css');  <-- server absolute path
          define('css_web_root', '/css');               <-- web root, for HTML
          define('css_cache_root', '/cache/css');       <-- cache directory
          

          【讨论】:

            【解决方案6】:

            您可能想尝试类似 MVC 模式的方法。作为一个例子,ZendFrameworkds MVC 将变量$this-&gt;base_url 传递给视图。视图是 HTML 所在的位置,因此您可以在视图中执行以下操作:

            <link rel="stylesheet" href="<?php echo $this->base_url; ?>/css/sample.css" ... />
            

            您的问题正是导致我采用 MVC 模式的原因,它有很多优点。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-04-27
              • 2020-05-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多