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

php*_*_qq 1 php windows cmd

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

图片

很明显,路径设置正确,而且它在 http 协议下按预期工作。我假设在 cmd 中存在阻塞相对路径的东西,因为如果我用绝对路径替换它,文件就会被包含在内。然而,这并不高效,因为文件系统可能会发生变化,并且必须使用相对路径。我对操作系统的东西真的很糟糕,所以我想我不应该再做任何假设了。谢谢!

编辑:头脑=吹

在此处输入图片说明

hek*_*mgl 6

基本:

当从HTTP所谓的工作目录index.phpC:\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");
Run Code Online (Sandbox Code Playgroud)

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


使用 include_path

另一个好主意是利用该include_path指令使库文件的真实位置对应用程序透明。当您更改目录布局时,这将为您提供更多自由。include_path是一个配置值,可以php.ini在脚本中或脚本中设置,并包含一个列表 od 目录,如果您将相对路径传递给requireinclude以及一些函数,例如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')
)));
Run Code Online (Sandbox Code Playgroud)

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

require_once 'System.php';
require_once 'routers/Foo.php';
Run Code Online (Sandbox Code Playgroud)

自动加载

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

库/人.php

<?php

class Person {

    ... some code
}
Run Code Online (Sandbox Code Playgroud)

索引.php

<?php

$hek2mgl = new Person();
Run Code Online (Sandbox Code Playgroud)

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

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

您需要使用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();
Run Code Online (Sandbox Code Playgroud)

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