【问题标题】:Which namespace configuration for composer作曲家的哪个命名空间配置
【发布时间】:2017-02-26 10:56:49
【问题描述】:

我正在尝试通过 composer 使用 PHPMailer。

我正在为我的应用程序使用命名空间和 PSR-4 自动加载

我的文件组织是这样的

-bin
  -controllers
    - Controller.php (namespace bin\controllers)
  -vendor
    -phpmailer
      -phpmailer
       -src
         PHPMailer.php (namespace HPMailer\PHPMailer)

在 composer.json 中,我写了这个

"autoload": {
    "psr-4": {"bin\\vendor\\phpmailer\\": "bin/vendor/phpmailer/phpmailer/src/PHPMailer.php"}
}

但是当我使用

<?php

namespace bin\controllers;

use bin\vendor\phpmailer\PHPMailer;

abstract class Controller {

    public function __construct()
    {
        $mail = new PHPMailer();
    }
}

我遇到了一个致命错误:

require_once(): 未能打开所需的 '/Users/thomas/Library/Mobile Documents/com~apple~CloudDocs/saveProject/bin/../bin/vendor/phpmailer/PHPMailer.php'

如何配置命名空间以正确使用该类?

非常感谢。

【问题讨论】:

    标签: php composer-php phpmailer


    【解决方案1】:

    你混淆了路径和namespaces;在大多数情况下,它们是独立的,但 PSR-4 和朋友帮助将它们映射到另一个。

    PHPMailer 仅支持 6.0 版本的命名空间,该版本尚未发布,但您当然可以使用预发布版本。

    use bin\vendor\phpmailer\PHPMailer;
    

    应该是:

    use PHPMailer\PHPMailer\PHPMailer;
    

    use 关键字用于将实体从另一个命名空间导入当前命名空间 - 请注意,这在概念上与包含 include / require 的文件不同。

    看起来您也在自己的应用程序中混合命名空间 - 通常您会使用基于 &lt;vendorname&gt;\&lt;projectname&gt; 模式的命名空间,因此您的示例控制器可能是:

    namespace MyCompany\MyProject;
    
    class MyMailController...
    

    或者您可以在自己的项目中使用多个命名空间,如下所示:

    namespace MyCompany\MyProject\Controllers;
    
    class Mail...
    

    这将定义MyCompany\MyProject\Controllers\Mail 类。

    【讨论】:

    • 我的错误,感谢您快速正确的回答:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 2013-04-08
    • 2013-08-11
    • 2015-02-02
    • 2016-12-18
    • 1970-01-01
    • 2012-09-07
    相关资源
    最近更新 更多