我目前正在测试cmd中的一些代码,而且我遇到了相对路径的一些问题。
可以清楚地看到路径设置正确,而且它在http协议下按预期工作。我假设有一些阻止cmd中相对路径的东西,因为如果我用绝对路径替换它,那么文件就会包含在内。然而,这不是有效的,因为文件系统可能会改变,并且必须使用相对路径。对于操作系统的东西,我真的很糟糕,所以我想我不应该做更多的假设。谢谢!
编辑:Mind = Blown
答案 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目录,如果您将相对路径传递给require
或include
,则应该显示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__)));