【问题标题】:How to include class?如何包括类?
【发布时间】:2021-09-07 06:43:06
【问题描述】:
handlers/
     handler.php
src/
     Model.php

我正在尝试包含课程 模型.php

<?php 
declare(strict_types=1);

namespace App;

class Model{
    }

handler.php

<?php 
include_once($_SERVER['DOCUMENT_ROOT'].'/src/Model.php');

$model=new Model();

我收到一个错误:

找不到类“模型”

是不是因为我使用了composer autoloader?

"autoload": {
        "psr-4": {
            "App\\": ["src/"]


        }
    },

【问题讨论】:

  • 试试__DIR__ . '/../src/Model.php'
  • 如果你使用 composer 自动加载器,你不需要在 handler.php 中包含模型类。您只需要包含作曲家自动加载脚本。这通常在您的应用程序的入口点完成。您还需要在 handler.php 中为 App\Model 添加一个 use 语句,或者在您在那里实例化它时使用该类的完全限定名称。
  • 你在哪里定义了那个类Model(没有任何命名空间)?据我所知,您正在使用命名空间App 中的一个类,您应该将其用作new App\Model() 或通过use 语句使用

标签: php composer-php autoload


【解决方案1】:

模型.php

<?php 

declare(strict_types=1);

namespace src;

class Model{}

处理程序.php

<?php 
    
use src\Model;

require __DIR__ . '../vendor/autoload.php'; // or whatever to route is to your autoload file

$model=new Model();

我要提到的最后一件事是,自动加载文件中指定的目录应该是理想情况下包含所有类的文件夹。除此之外,命名空间应该是该类所在目录中的子目录。所以说你有文件夹Classes,然后src可能在它下面,你会这样做:

"autoload": {
    "psr-4": {
        "": "Classes/"
    }
},

namespace src;

如果您的班级位于 src 文件夹中,则此方法有效。如果您添加了 src 的子文件夹,其中包含您的课程:

namespace src\subfolder;

【讨论】:

  • 请在您的答案中添加一些解释,以便其他人可以从中学习。例如,为什么要修改命名空间?你的Handler.php 应该如何找到不包含任何自动加载器的类?
【解决方案2】:

好的,我找到了解决方案。你需要连接autoload.php

<?php 
require_once __DIR__.'/../vendor/autoload.php';
use App\Model;
$s=new Model();

【讨论】:

    猜你喜欢
    • 2016-01-27
    • 2022-01-13
    • 2012-01-04
    • 2015-07-19
    • 2012-04-01
    • 2022-06-17
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多