从cmd运行php:相对路径问题

时间:2013-12-01 14:44:28

标签: php windows cmd

我目前正在测试cmd中的一些代码,而且我遇到了相对路径的一些问题。

pic

可以清楚地看到路径设置正确,而且它在http协议下按预期工作。我假设有一些阻止cmd中相对路径的东西,因为如果我用绝对路径替换它,那么文件就会包含在内。然而,这不是有效的,因为文件系统可能会改变,并且必须使用相对路径。对于操作系统的东西,我真的很糟糕,所以我想我不应该做更多的假设。谢谢!

编辑:Mind = Blown

enter image description here

2 个答案:

答案 0 :(得分:4)

<强>基础:

从HTTP调用时,index.php的工作目录从命令行调用C:\xampp\htdocs\actualframework\public\(在您的示例中),它是C:\xampp\php。因此,脚本会尝试包含不存在的C:\xampp\Framework/class/routers/System.php

您需要使用__DIR__常量,以使require命令独立于调用index.php的位置工作:

require(__DIR__ . "/../Framework/class/routers/System.php");

__DIR__指向源文件所在的目录,该示例使用__DIR__常量,在您的示例中为:C:\xampp\htdocs\actualframework\public\


使用include_path

另一个好主意是利用include_path指令,以使库文件的真实位置对应用程序透明。一旦更改目录布局,这将为您提供更多自由。 include_path是一个配置值,可以在php.ini或脚本中设置,并包含一个列表od目录,如果您将相对路径传递给requireinclude,则应该显示php以及file_get_contents()fopen(),......

等一些功能

index.php之上配置包含路径(或在单独的bootstrap.php中包含):

ini_set('include_path', implode(PATH_SEPARATOR, array(
    __DIR__ . '/../Framework/class',
    __DIR__ . '/../Framework/interface',
    // add the existing value at the end
    ini_get('include_path')
)));

现在你可以使用这样的路径来要求类:

require_once 'System.php';
require_once 'routers/Foo.php';

<强>自动加载

从PHP5开始,有一个名为autoloading的功能可以简化类的包含。自动加载基本上提供了定义钩子函数的能力,每次访问之前都会调用该函数,而之前没有定义过。想象一下,你有以下文件:

LIB / Person.php

<?php

class Person {

    ... some code
}

的index.php

<?php

$hek2mgl = new Person();

通常此代码会触发错误,因为访问Person时不包含lib/Person.php。这是可以使用自动加载的点。让我们看看一个简单的自动加载方法在这个(简单示例)中的样子:

function autoload($classname) {
    $path = __DIR__ . "/lib/$classname.php";
    if(file_exists($path)) {
        require_once $path;
    }
}

您需要使用spl_autoload_register()重新加载自动加载器。 index.php可能如下所示:

<?php

// define simple autoloader for project
function autoload($classname) {
    $path = __DIR__ . "/lib/$classname.php";
    if(file_exists($path)) {
        require_once $path;
    }
}

// register autoloader
spl_autoload_register('autoload');

// will work now
$hek2mgl = new Person();

如果你问我,自动加载是PHP5中最酷的事情之一。您可以优化自动加载方法以使用include_path指令。这样做可以很容易地使用几个库,而无需考虑它们在文件系统中的物理存储位置。您可以尝试我的Jm_Autloader,代码在github上,您可以使用PEAR或composer安装它。

答案 1 :(得分:1)

正如@ hek2mgl指出的那样,它与当前工作目录的错误有关。

在您的情况下,工作目录为c:/xampp/php/,但应为c:/xampp/htdocs/actualframework/public/。 至少有两种解决方案可以解决这个问题,其中最明显的就是在命令行上更改工作目录:

cd c:/xampp/htdocs/actualframework/public/
c:/xampp/php/php.exe index.php

或者,您可以在尝试index.php之前将以下内容添加到include/require中,从PHP脚本中设置当前工作目录:

chdir(realpath(dirname(__FILE__)));