簡體   English   中英

PHP對在路徑中使用__DIR__和../感到困惑

[英]PHP confused about use of __DIR__ and ../ in a path

我遇到了一個具有這種結構的項目。

-projectRoot
--src
---bootstrap.php
--composer.json
--public
---index.php
---css
---images

現在在公共目錄中, index.php包含以下內容

//in projectRoot/public/index.php
<?php

  require __DIR__."/../src/bootstrap.php";

 ?> 

我知道__DIR__常量解析為當前正在執行的php腳本文件的絕對目錄。因此在上面的示例中,我希望它是ProjectRoot/public

推演

index.php中require查找哪個路徑? 上面路徑中的父目錄..解析為什么?

PS :我讀到上面的設置的全部目的是確保無論在何處調用index.php,相對路徑都繼續起作用。 究竟如何運作? 謝謝。

<?php
    require __DIR__ . "/some_file.php";   
    /* __DIR__ SIMPLY POINTS TO THE DIRECTORY IN WHICH THE ACTIVE SCRIPT LIVES
       - THE DIRECTORY OF THE EXECUTING SCRIPT... THEN REQUIRES THE FILE
       "some_file.php" WITHIN THAT DIRECTORY.
       THE REAL-PATH SHOULD REFLECT SOMETHING LIKE: projectRoot/public/some_file.php
    */

    require __DIR__ . "/../src/bootstrap.php"; 
    /* FOLLOWING THE LOGIC ABOVE, __DIR__ . "/../"  __DIR__ AGAIN POINTS TO 
       THE DIRECTORY IN WHICH THE ACTIVE SCRIPT LIVES WHILE "/../" TELLS
       THE REQUIRE DIRECTIVE TO LOOK ONE DIRECTORY ABOVE THE CURRENT DIRECTORY
       (AND LOCATE WITHIN THAT DIRECTORY ANOTHER DIRECTORY CALLED "src" IN THIS CASE...)
       THEN WITHIN THAT "scr" DIRECTORY LOOK FOR A FILE CALLED:
       "bootstrap.php" AND REQUIRE/INCLUDE IT...
       THE REAL-PATH SHOULD REFLECT SOMETHING LIKE: projectRoot/src/bootstrap.php
    */

     // TO UNDERSTAND THESE CONCEPTS MORE CLEARLY, IT WOULD BE ADVISED TO 
     // TRY SOMETHING LIKE THESE:
     var_dump( realpath(__DIR__ . "/../src/bootstrap.php") );
     var_dump( realpath(__DIR__ . "/index.php") );

這是您的index.php發生的事情:

__DIR__ // This will be projectRoot/public
/../    // This will go one level up so it'll be projectRoot
src/    // This will go inside the src folder (projectRoot/src)
bootstrap.php // This will open the bootstrap.php

所以最后,它將以projectRoot/src/bootstrap.php為目標...這是它所需的文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM