【问题标题】:Load class from vendor folder inside autoloaded class from a folder outside vendor从供应商外部的文件夹中自动加载类中的供应商文件夹加载类
【发布时间】:2018-12-25 19:35:41
【问题描述】:

我有一个这样的文件夹结构的 php 应用程序

-/app
-/vendor
-index.php

我的“vendor/autoload.php”文件包含在“index.php”文件中。当我在“index.php”文件中从供应商那里调用一个类时,例如 upload() 加载它没有问题。但是,如果我从“app”文件夹内的类中调用同一个类,则会显示类未找到错误。

“app”文件夹中的类会像这样自动加载

"autoload": {
    "psr-4":{
        "App\\": "app/"
    }
},
"require": {
    "verot/class.upload.php": "dev-master"
}

如何从 app 文件夹中自动加载的类中的供应商文件夹中调用类?

编辑:

app 文件夹中的类在“index.php”中被调用,像这样

include("vendor/autoload.php");
$get_class = 'User';
require_once('app/'.$get_class.'.php');
$get_class = 'App\\'.str_replace('/', '\\', $class_name);
if(method_exists($get_class , 'uploadImage')) {     
 $class = new $get_class();
 $class->{ 'uploadImage' }();
}

这是 User 类中调用的 upload()

namespace App\User;

class User{
 public function uploadImage() 
 {
   $file = 'user.jpg';
   $handle = new upload($file);
 }
}

这是错误信息

Class 'App\upload' not found in app/User.php:20

【问题讨论】:

  • 当我们看不到这些类在哪里被调用时,很难找到问题所在。能给我们举个例子吗?
  • 它可以是很多东西。请向我们展示有效的代码和无效的代码。您还应该包含实际的错误消息。
  • 我已经添加了类的调用方式和错误信息
  • 这不是你打电话的地方,但实际上打电话给upload()。这似乎是一些奇怪的通用代码。我不知道这里发生了什么。
  • 我进一步更新了代码以使其更清晰

标签: php composer-php


【解决方案1】:

这是一个命名空间问题。您需要添加:

use upload;

App\User-file 中的命名空间声明下导入上传类,或者在使用时需要使用 upload 类的完整命名空间:

$handle = new \upload($file); 

你可以阅读更多关于it in the manual

注意:在发布的代码中,当您尝试在uploadImage()-function 中使用$file 时,它是未定义的。

注意 2: 如果您在 index.php 的顶部包含了 vendor/autoload.php(您应该这样做),则无需在 PHP 中手动包含这些类。作曲家自动加载器将自动处理。只需:$user = new App\User

【讨论】:

  • 这成功了!我一直在寻找的完美解决方案!我有预感但不知道“使用”上传类的命名空间是什么,哈哈!非常感谢!
猜你喜欢
  • 2017-02-22
  • 1970-01-01
  • 1970-01-01
  • 2019-03-16
  • 2015-11-20
  • 1970-01-01
  • 2015-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多