php require_once包含相对于文件的文件,而不是工作目录

php require_once包含相对于文件的文件,而不是工作目录,php,include-path,require-once,set-include-path,Php,Include Path,Require Once,Set Include Path,我在包含文件方面有一些问题。问题不在于require_曾经找不到文件,而是它可以在文件不存在的地方找到文件。我已把这个问题简化为三个小班 这就是我的目录结构: public_html/ index.php commands/ CommandFactory.php account/ Status.php index.php: require_once 'commands/CommandFactory.php'; $fact

我在包含文件方面有一些问题。问题不在于require_曾经找不到文件,而是它可以在文件不存在的地方找到文件。我已把这个问题简化为三个小班

这就是我的目录结构:

public_html/
    index.php
    commands/
        CommandFactory.php
        account/
            Status.php
index.php:

require_once 'commands/CommandFactory.php';

$factory = new CommandFactory();
CommandFactory.php:

    class CommandFactory{

    public function __construct()
    {
        echo getcwd() . '<br/>'; //xxx\public_html (which is good, this is where index.php is
        //require_once 'account/Status.php'; // This works as expected
        require_once 'account/Status.php'; // This ALSO works, but it shouldn't

        $status = new Status(); // This works, though it shouldn't. 
    }
}
class命令工厂{
公共函数构造()
{
echo getcwd()。
;//xxx\public_html(这很好,这就是index.php所在的位置 //require_once'account/Status.php';//这可以正常工作 require_once'account/Status.php';//这也可以,但不应该 $status=newstatus();//这是可行的,尽管它不应该这样做。 } }

我已经通过将CommandFactory移动到另一个目录进行了测试,这解决了问题。但是,我无法理解为什么可以包含该文件。它不应该包含状态,与CommandFactory相对,而应该是与index.php相对。我添加了当前的工作目录,以查看出了什么问题,但我无法找出它。有人知道吗如何以及为什么这样做?

来自php.net网站:

文件是根据给定的文件路径包含的,如果没有给定文件路径, 指定的包含路径。如果在 include\u路径,include将最终检入调用脚本自己的 目录和失败前的当前工作目录 如果include构造找不到文件,它将发出警告;此 与require不同,它将发出致命错误


否决我的问题的人能解释为什么吗?如果你要求,路径是相对于当前文件的。而不是索引,不管怎样,在类中包含文件实际上不是一个好做法。你肯定应该考虑自动加载类“如果你要求,路径是相对于当前文件的。”这是不对的。我知道我在OOP中做什么。而且,如果它是相对于当前文件的,为什么“commands/account/Status.php”是否也可以工作?
文件是基于给定的文件路径包含的,或者如果没有给定,则根据指定的include\u路径包含的。如果在include\u路径中找不到该文件,include将在失败之前最终检入调用脚本自己的目录和当前工作目录。如果include构造找不到文件,它将发出警告;这将导致它的行为与require不同,require会发出致命错误
goddommit,你是对的。我希望我能早点看到。你应该回答这个问题,这样我才能接受:)谢谢你提到自动加载类。我知道什么时候和为什么要使用它们,这不在我当前的项目中(我总是在类外需要_一次,除了在这个项目中,因为我正在加载的类是动态的),但是其他人可能会觉得它很有趣。谢谢:)哈哈,我希望它更严格。没问题。我喜欢把DIR放在每个include/require之前,例如,因为DIR,我认为PHP从未包含相对于相对路径的类。但我应该倾向于使用php.net。