gpt4 book ai didi

php - 从 cmd : relative paths issue 运行 php

转载 作者:可可西里 更新时间:2023-11-01 11:12:58 28 4
gpt4 key购买 nike

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

pic

可见路径设置正确,而且在http协议(protocol)下运行正常。我假设有一些东西阻止了 cmd 中的相对路径,因为如果我用绝对路径替换它,文件就会被包含在内。然而,这并不高效,因为文件系统可能会更改并且必须使用相对路径。我对操作系统的东西真的很糟糕,所以我想我不应该再做任何假设了。谢谢!

编辑:思想=吹

enter image description here

最佳答案

基础知识:

当从 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 或脚本中设置,它包含一个目录列表,如果您将相对路径传递给 require,php 应该查看的目录include 以及一些函数,例如 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 的特性。这简化了类的包含。自动加载基本上提供了定义钩子(Hook)函数的能力,每次访问以前未定义的类时都会调用该函数。假设您有以下文件:

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 安装它。

关于php - 从 cmd : relative paths issue 运行 php,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20313345/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com