我有这个类:
class PageBuilder {
public function GetHeader() {
include(dirname(dirname(__FILE__)) . '/template/header.php');
}
}
调用时会将头文件插入到我的页面中。一切都很好。
$page_builder->GetHeader();
在header.php
中是HTML
文件的顶部,该文件包括一个菜单。我的问题是,根据从哪里调用PageBuilder
,会更改菜单链接URL
s。
如何确保它们始终相对于根文件夹。
dirname(__FILE__)
不起作用,因为它把URL
变成了file:///
,而且我真的不想附加整个http://www.blahblah.com/blah
,因为如果它是相对于根的,那么这一切都无关紧要。
编辑
因此,当有人发帖时,你可以使用$_SERVER['']
,但哪一个是可靠的,毫无疑问,PHP
会提出一些令人眼花缭乱的警告。
看,我在想$_SERVER['SERVER_ADDR']
、$_SERVER['SERVER_NAME']
或$_SERVER['HTTP_HOST']
。。。。。
目前正在进行$_SERVER['HTTP_HOST']
。。结果是失败。
只是前缀为/
就解析为localhost根,所以我的链接是localhost/admin/profile.php
而不是localhost/TestApp/admin/profile.php
,我真的必须指定它位于名为TestApp
的文件夹中吗?
首先需要区分本地文件路径和URL。这两者毫无关系。PHP及其__FILE__
和dirname()
及相关部分只处理服务器硬盘上的本地文件路径。另一方面,URL完全是任意字符串,您需要以合理的方式将其组合在一起。URL引用任何一个特定文件的方式都是无限的,这取决于你自己。
您可以尝试使用$_SERVER
中可用的各种路径来确定请求的URL,并在此基础上构建相对URL。然而,这相当容易出错,而且过于复杂。相反,您应该使用根相对URL。即代替
foo/bar.html
相对于浏览器当前所在的URL,您总是使用
/foo/bar.html
它总是指同一个URL,而不管它当前相对于哪个URL。
如果你需要所有URL的前缀,我会创建一个包装器函数,根据配置或基于$_SERVER
自动计算出自己的根URL,根据需要添加前缀。
在@deceze的帮助下反复尝试后,我只需通过一个路由类传递我的URL
,该路由类在URL
前面加上"/TestApp/",如果项目因为类的使用而被移动,这可以很容易地更改。
所以我做了:
<a href="<?php $url_routing->ParseUrl('admin/account/logout.php') ?>">Log Out </a>
获取通过:
public function ParseUrl($url) {
return '/TestApp/' . $url;
}
这几乎不是最佳实践,但一种语言本身不遵循任何语言,就不可能有最佳实践。
看看@Anthony使用$_SERVER['PHP_SELF'];
的答案,它总是给出TestApp
文件夹。需要更多的调查,但我会接受的。我假设它是相对于服务器地址的。