【问题标题】:how resolve PHP class defined in another folder如何解析在另一个文件夹中定义的 PHP 类
【发布时间】:2020-11-14 17:34:59
【问题描述】:

当类定义在正在运行的 .php 文件的同级文件夹中时,PHP 如何找到一个类?我正在运行的 php 文件位于 ./examples 文件夹中。类文件位于./src/Fedex。

./examples/address-validation.php 用于设置类路径的 use 语句

use FedEx\AddressValidationService\Request;
use FedEx\AddressValidationService\ComplexType;
use FedEx\AddressValidationService\SimpleType;

$addressValidationRequest = new ComplexType\AddressValidationRequest();

当我运行 .php 文件时,出现此未找到错误:

Fatal error: Uncaught Error: Class 'FedEx\AddressValidationService\ComplexType\AddressValidationRequest' 
not found in C:\xampp\htdocs\php-fedex-api-wrapper\examples\address-validation.php

类的位置在./src/FedEx/AddressValidationService 文件夹中。 ./src 和 ./examples 文件夹都在同一个父文件夹中。

【问题讨论】:

  • 您应该使用$_SERVER['DOCUMENT_ROOT'] 来解决此类问题。
  • 类的自动解析和文件的加载是通过称为自动加载的机制完成的。你必须用自动加载注册东西,然后你就可以使用它们了。 Composer 在帮助您生成注册表方面做得很好,并提供了将命名空间/类映射到文件系统的各种方法。
  • @JAAulde 是对的。您必须首先使用自动加载注册类。如果您对本地地址有疑问,请使用 dirname(__FILE__) 来定义正确的位置。
  • 你在 Composer 自动加载器中使用过这个 API 吗?
  • use 语句只设置一个短别名,因此您不需要每次都输入完整的命名空间;它们与类或文件加载没有任何关系。要从其他文件加载代码,您需要 include 他们,或使用包含它们的工具(例如 Composer 的自动加载器)。

标签: php


【解决方案1】:

如果你有一个或者如果你有一个自定义加载器,你应该在作曲家自动加载器中定义该类的路径,你应该教那个加载器来解析命名空间FedEx\AddressValidationService\Request内的类

如果您在项目的 ROOT 目录下定义了 composer.json 文件,您可以像这样定义 PSR-4 autloader

{
    "autoload": {
        "psr-4": {"FedEx\\": "./src/FedEx/"}
    }
}

之后你必须执行composer dump-autoload

如果您想创建自定义自动加载器并且不想使用我强烈推荐的 Composer,您可以了解更多关于 spl-autoload-register

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2022-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-09
  • 1970-01-01
  • 2015-11-03
  • 2018-03-18
相关资源
最近更新 更多