如何在php中实现“应用范围变量”?

时间:2010-12-26 03:22:10

标签: php global-variables environment-variables

我现在正在开发一个新的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片段。但是,这只能在index.php中工作,它位于我的应用程序文件夹的根目录下。我认为这不好。

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

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

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

我正在考虑使用:

  • 全局变量&lt; ==不良做法违反OOP?我从c编程开始就停止这样做了;
  • set_include_path&lt; ==所以php会查找它,需要唯一的名称和正确的命名约定吗?
  • 从ini文件加载变量? &lt; ==如何实现这一目标?
  • 有任何新想法吗?

6 个答案:

答案 0 :(得分:3)

您不想使用全局变量,因为它们会中断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(&gt; = 5.3.0):

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

答案 1 :(得分:1)

此处的路径是URI - 而不是文件系统位置。无论如何,你可能试图以错误的方式解决这个问题。

答案 2 :(得分:1)

您必须使用相对路径。所以只需“css / sample.css”的“/css/sample.css”instad。

即使您的.php位于yourdomain.com/somefolder/file.php

,也不会始终从yourdomain.com/css/sample.css加载

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:1)

  1. 没有理由使用除延迟编码之外的全局变量
  2. 效率不高,如果在不同路径上使用两个相同的文件名,PHP将更难以确定要包含哪个文件
  3. 您正在寻找
  4. parse_ini_file
  5. 但是,我更喜欢使用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
    

答案 5 :(得分:1)

你可能想尝试类似MVC模式的东西。作为示例,ZendFrameworkds MVC将变量$this->base_url传递给视图。这些视图是HTML所在的位置,因此您可以在视图中执行以下操作:

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

你的问题正是导致我进入MVC模式的原因,它有很多优点。