Dre*_*rew 4 php code-organization
我正在根据Essential PHP SecurityChris Shiflett 的优秀作品审核我的网站设计.
我想采用的其中一个建议是将所有可能的文件从webroot中移出,这包括包含.
在我的共享主机上这样做很简单,但我想知道人们如何在他们的开发测试平台上处理这个问题?
目前我已经配置了XAMPP安装,以便localhost/mysite/匹配D:\mysite\包含的XAMPP安装在D:\mysite\includes\
为了保持包含路径准确,我猜我需要在本地磁盘上复制服务器的路径?就像是D:\mysite\public_html\
有没有更好的办法?
这似乎是很多php开发人员的一个难点,所以让我们好好解决它.大多数PHP应用程序都会丢弃它们的代码include '../../library/someclass.php.class'.这对任何人来说都不是很好,因为它很容易打破,而且当你应该编码时,没有人喜欢做路径清洁工作.这也有点像建造一个纸牌屋并巩固连接,因为害怕任何变化.好吧,也许我们可以创建一个常量,并使用完整路径?
define('PATH', '/home/me/webroot/Application');
include(PATH . '/Library/someclass.php.class');
Run Code Online (Sandbox Code Playgroud)
那很好,但是嗯,如果我们在Windows上部署怎么办?另外,我们要在每个脚本入口点上定义路径吗?如果你问我,不是很干.此外,移动部署将是一个巨大的痛苦.显然,虽然我们离得更近,但并没有太大的改进.
幸运的是,PHP提供了一些魔术子弹功能,可以立即帮助我们.
因此,我们假设您的应用程序只有一个入口点,或者至少是一个共享头文件.如果我们知道头文件与代码根相关联,我们可以很快地获取我们的部署根.IE,in/home/me/webroot/Application/Init/set_paths.php
define('PATH_SITE', realpath(dirname(__FILE__) . '/../../'));
Run Code Online (Sandbox Code Playgroud)
太棒了,那就是我们的文档根.它是独立于操作系统的,如果你改变set_paths.php生活,它很容易适应.现在我们可以在应用程序中讨论其他一些位置,因为常量非常方便:
define('PATH_APPLICATION', realpath(PATH_SITE . "/Application"));
define('PATH_LIBRARY', realpath(PATH_SITE . "/Application/Library"));
define('PATH_CONFIG', realpath(PATH_SITE . "/Config"));
define('PATH_WRITE', realpath(PATH_SITE . "/Volatile"));
Run Code Online (Sandbox Code Playgroud)
这一切都非常好,但它并不比我们以前的解决方案好多少.输入PHP包含路径.通过在路径中添加相关常量,我们不需要每次都定义它们.包含路径中的路径顺序实际上对速度非常重要,因此我们会尽一切努力按顺序使用它们.
$paths['inc'] = array_flip(explode(PATH_SEPARATOR, get_include_path()));
unset($paths['inc']['.']);
$paths['inc'] = array_flip($paths['inc']);
// The first item on the path the external
// libs that get used all the time,
// then the application path, then the
// site path, and any php configured items.
// The current directory should be last.
$paths = array_merge(array(PATH_LIBRARY, PATH_APPLICATION, PATH_SITE), $paths['inc'], array("."));
set_include_path(implode(PATH_SEPARATOR, $paths));
Run Code Online (Sandbox Code Playgroud)
现在,我们应用程序中的所有关键位置都在路径上,无论您决定存储库,设置等,您都可以在内容中包含内容.
include('someclass.php.class');
Run Code Online (Sandbox Code Playgroud)
更进一步
如果你正在使用一个设计得很好的OOP应用程序,我们可以更进一步.如果您订阅了一个文件,一个类,那么PEAR命名约定会让生活变得非常简单.
PEAR命名约定规定了文件系统和类之间的1:1关系.例如,可以在include_path上的文件"Foo/Bar/Baz.php"中找到类Foo_Bar_Baz. 资源
一旦你有一个可预测的文件映射到类,你就可以实现spl_autoload_register你可以替换
include('someclass.php.class');
new SomeClass();
Run Code Online (Sandbox Code Playgroud)
简单地说
new SomeClass();
Run Code Online (Sandbox Code Playgroud)
并让PHP为您处理它.
| 归档时间: |
|
| 查看次数: |
1930 次 |
| 最近记录: |