【问题标题】:Why include __DIR__ in the require_once?为什么在 require_once 中包含 __DIR__?
【发布时间】:2015-09-07 18:54:08
【问题描述】:

例如,我总是看到这样的自动加载器:

require_once __DIR__ . '/../vendor/autoload.php';

那和更简洁有什么区别

require_once '../vendor/autoload.php';

?

【问题讨论】:

    标签: php autoloader


    【解决方案1】:

    当前接受的答案并不能完全解释使用__DIR__ 的原因,我认为答案是错误的。 我将解释为什么我们真的需要这个。 假设我们有这样的文件结构

    - index.php
    - file3.php -(content: hello fake world)
    - dir/
       - file2.php
       - file3.php - (content: hello world)
    

    如果我们从 file2.php 中包含 file3.php 并直接运行 file2.php,我们将看到输出 hello world。 现在当我们在 index.php 中包含 file2.php 时,当代码开始执行时,它会再次看到 file2 使用 include 'file3.php' 包含 file3,首先执行将在当前执行目录中查找 file3(这是同一目录)其中 index.php 存在)..由于 file3.php 存在于该目录中,它将包含 file3.php 而不是 dir/file3.php,我们将看到输出 hello fake world 而不是 hello world

    如果 file3.php 不存在于同一目录中,则它将包含正确的 dir/file3.php 文件,这会使接受的答案无效,因为它指出 file3.php cannot be included 不正确。包括在内。

    然而,这里有必要使用__DIR__。如果我们在 file2.php 中使用include __DIR__ . '/file3.php',那么即使父目录中存在另一个 file3.php,它也会包含正确的文件。

    【讨论】:

      【解决方案2】:

      PHP 脚本相对于当前路径(getcwd() 的结果)运行,而不是相对于它们自己文件的路径。使用 __DIR__ 强制包含相对于它们自己的路径发生。

      为了演示,创建以下文件(和目录):

      - file1.php
      - dir/
         - file2.php
         - file3.php
      

      如果file2.php 像这样包含file3.php

      include `file3.php`.
      

      如果你直接调用file2.php 就可以了。但是,如果file1.php 包含 file2.php,则当前目录(getcwd())对于file2.php 将是错误的,因此不能包含file3.php

      【讨论】:

        【解决方案3】:

        包括它可以设置一些 PHP 自动搜索的文件夹。当您包含具有相对路径的文件时,您会在所有文件夹中进行搜索。最好定义真实路径,以防止加载错误文件时出现一些错误。

        https://secure.php.net/manual/en/function.set-include-path.php

        然后您可以确定您加载了正确的文件。

        【讨论】:

        • 虽然这也是正确的,但这并不是最重要的原因。
        猜你喜欢
        • 2013-07-12
        • 2018-04-09
        • 1970-01-01
        • 2013-02-17
        • 1970-01-01
        • 1970-01-01
        • 2011-04-03
        • 2013-05-20
        • 1970-01-01
        相关资源
        最近更新 更多