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

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

基本:
当从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");
Run Code Online (Sandbox Code Playgroud)
__DIR__指向使用__DIR__常量的源文件所在的目录,在您的示例中:C:\xampp\htdocs\actualframework\public\
使用 include_path
另一个好主意是利用该include_path指令使库文件的真实位置对应用程序透明。当您更改目录布局时,这将为您提供更多自由。include_path是一个配置值,可以php.ini在脚本中或脚本中设置,并包含一个列表 od 目录,如果您将相对路径传递给require或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')
)));
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安装它。
| 归档时间: |
|
| 查看次数: |
1906 次 |
| 最近记录: |