gpt4 book ai didi

php - 在您的开发环境中组织 PHP 包含

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:01:52 27 4
gpt4 key购买 nike

我正在根据 Chris Shiflett 出色的 Essential PHP Security 审核我的网站设计。

我想采纳的建议之一是将所有可能的文件移出 webroot,这包括 includes。

在我的共享主机上这样做很简单,但我想知道人们如何在他们的开发测试台上处理这个问题?

目前我已经配置了一个 XAMPP 安装,以便 localhost/mysite/D:\mysite\ 匹配,其中包含存储在 D :\mysite\includes\

为了保持包含路径的准确性,我想我需要在我的本地磁盘上复制服务器的路径?类似于 D:\mysite\public_html\

有没有更好的办法?

最佳答案

这似乎是很多 php 开发人员的症结所在,所以让我们好好解决它。大多数 PHP 应用程序的代码中都包含 include '../../library/someclass.php.class'。这对任何人都没有多大好处,因为它很容易被破坏,而且没有人喜欢在应该编码的时候做路径管理员工作。这也有点像 build 纸牌屋并加固连接处,以免发生任何变化。好吧,也许我们可以只创建一个常量,并使用完整路径?

define('PATH', '/home/me/webroot/Application');
include(PATH . '/Library/someclass.php.class');

那很好,但是呃,如果我们在 Windows 上部署呢?另外,我们要在每个脚本入口点定义路径吗?如果你问我,不是很干。另外,移动部署将是一个巨大的痛苦。显然,虽然我们更接近了,但并没有太大的改进。

幸运的是,PHP 提供了一些神奇的子弹函数,可以立即帮助我们解决问题。

那么假设您的应用程序有一个入口点,或者至少有一个共享头文件。如果我们知道我们的头文件与代码根相关的位置,我们可以很快地获取我们的部署根。 IE,在 /home/me/webroot/Application/Init/set_paths.php

define('PATH_SITE', realpath(dirname(__FILE__) . '/../../'));

太棒了,那是我们的文档根目录。它独立于操作系统,如果您更改 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"));

这一切都很好,但它并没有比我们之前的解决方案好多少。输入 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));

现在我们应用程序中的所有关键位置都在路径上,无论您决定将库、设置等存储在何处,您都可以包含自己喜欢的内容。

include('someclass.php.class');

更进一步

如果您使用的是设计相当良好的 OOP 应用程序,我们可以更进一步。如果您订阅一个文件、一个类,那么 PEAR 命名约定会让生活变得非常简单。

The PEAR naming conventions dictate a 1:1 relation between the filesystem and the class. As an example, the class Foo_Bar_Baz would be found in the file "Foo/Bar/Baz.php" on your include_path. source

一旦有了文件到类的可预测映射,就可以实现 spl_autoload_register你可以替换

include('someclass.php.class');
new SomeClass();

简单地

new SomeClass();

让 PHP 为您处理。

关于php - 在您的开发环境中组织 PHP 包含,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4621544/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com