我现在正在开发一个新的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' ..."; ?>
它会评估到正确的位置吗?
我正在考虑使用:
答案 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_file或parse_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)
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
答案 5 :(得分:1)
你可能想尝试类似MVC模式的东西。作为示例,ZendFrameworkds MVC将变量$this->base_url
传递给视图。这些视图是HTML所在的位置,因此您可以在视图中执行以下操作:
<link rel="stylesheet" href="<?php echo $this->base_url; ?>/css/sample.css" ... />
你的问题正是导致我进入MVC模式的原因,它有很多优点。