【问题标题】:Best practice for PHP paths [duplicate]PHP路径的最佳实践[重复]
【发布时间】:2012-05-12 14:08:39
【问题描述】:

我一直在互联网上试图找出处理我网站中路径的最佳方法。我应该使用相对路径还是绝对路径?

我已经多次看到 dirname (FILE) 被提及。相对路径的一个问题是,不同目录级别的其他几个文件包含的 PHP 文件会导致相对路径中断。例如,如果目录结构是

Root
    A
    B
       b

如果 b 和 An 中的 PHP 文件包含 B 中的另一个文件,那么 B 中文件中代码的相对路径将不同。

那么一般来说,就代码中的包含和文件操作而言,处理文件路径的最佳方法是什么。

【问题讨论】:

  • 这就是“最好”的问题,它几乎总是主观的。

标签: php path twig


【解决方案1】:

您可以将所有包含文件放在一个主目录中。然后在配置文件或脚本本身中创建一个指向包含目录的路径变量。

【讨论】:

  • 这可行,但它破坏了我的组织。我试图将我的文件保存在一个逻辑目录结构中,因为有很多。
【解决方案2】:

新版php(PHP5.3)可以使用__autoload 因此,您只需要确定应用程序的根即可。

【讨论】:

  • 是否自动加载递归扫描目录路径,如果这样做,这似乎对性能不利。此外,自动加载似乎只适用于类,我的一些文件不是面向对象的。
  • 自 [php.net/manual/en/function.autoload.php](PHP 7.2) 起已被弃用。
【解决方案3】:

为文件的目录结构、PHP 文件和类名使用正确命名约定的最佳方式,并设计一个自动加载器以包含该文件

【讨论】:

  • 你有创建和自动加载器示例的好链接吗,我对php很陌生,还没有找到好的教程。
  • 谢谢,我读到了,但这似乎只适用于 OO,我的一些文件不是 OO,所以我猜这种方法行不通。
【解决方案4】:

尽管有很多方法可以找到路径,但我总是发现在项目根目录 index.phpconfig 的文件中定义一个常量最容易。 然后我可以将SITE_ROOT 用于包含/类加载器等,SITE_URL 用于视图、控制器、重定向等。

<?php
$root=pathinfo($_SERVER['SCRIPT_FILENAME']);
define ('BASE_FOLDER', basename($root['dirname']));
define ('SITE_ROOT',    realpath(dirname(__FILE__)));
define ('SITE_URL',    'http://'.$_SERVER['HTTP_HOST'].'/'.BASE_FOLDER);
?>

Basic class Autoloader

<?php
function __autoload($class_name) {
    include (SITE_ROOT.'/includes/'.$class_name.'.php');
}
$obj  = new MyClass1();
$obj2 = new MyClass2(); 
?>

【讨论】:

  • 使用这种方法,不是所有要使用自动加载器的文件都需要包含配置文件。如果是这样,最好的方法是使用 include('../../config.php'); 这样的相对路径。就像我上面提到的那样,如果不是所有文件都是 OO 的话,这会起作用吗
  • 在你的索引文件中定义常量,它只需要指向你的根目录,如果你的配置在根目录中,那么你需要做的就是include(SITE_ROOT.'/config.php'),不管你调用它有多深将始终指向同一个文件。 __autoload 仅在调用类时有效,它节省了为每个类执行 include (SITE_ROOT.'/includes/'.$class_name.'.php'); 的工作,它对于 MVC 模式中的模型非常方便,因为控制器通常从路由器/前端控制器类调用
  • 我不太明白这如何解决我的问题。即使我的根目录中有这个配置级别,我的所有其他文件仍然需要使用相对路径包含它。我遇到的问题的一个例子是我有一个 ErrorReporter 类,它包含在我的所有其他文件中,这些文件位于目录结构中的不同级别。在 ErrorReporter 类中,我有一些路径,但如果它们是相对的,则它们会相对于包含 ErrorReporter 的任何类,这意味着它们每次都不是相对于同一个位置。
【解决方案5】:

Zend 框架有一些关于优化包含路径的好建议:

http://framework.zend.com/manual/1.10/en/performance.classloading.html

即使您不使用 Zend 框架,这些也是很好的指导。一般要点是:

  • 使用绝对路径
  • 减少您定义的包含路径的数量
  • 最后定义当前目录,或者根本不定义
  • 尽早定义您的 Zend 框架 include_path(如果您不使用 Zend,则并不真正相关)

【讨论】:

    猜你喜欢
    • 2018-02-28
    • 2021-09-07
    • 2012-02-05
    • 2014-03-24
    • 2012-08-13
    • 2019-01-12
    • 2011-06-17
    • 1970-01-01
    • 2010-11-11
    相关资源
    最近更新 更多