在另一个命名空间中自动加载命名空间时出错

Posted

技术标签:

【中文标题】在另一个命名空间中自动加载命名空间时出错【英文标题】:Error autoloading namespace in another namespace 【发布时间】:2019-10-10 14:52:58 【问题描述】:

尝试从c_index.php 调用m_newEmployee 时出现以下错误。

我试过了:

$employee = new \App\model\newEmployee;

但这在m_newEmployee 中引起了另一个奇怪的错误。

当我这样做时,函数getEmployees() 不能用于创建任何对象。

c_index.php

<?php

namespace app\controller;

use app\model;

require_once "../task/vendor/autoload.php";
  /**
   *
   */
  class c_index
  

      function loadEmployees()
      
         $employee = new m_newEmployee;
         echo $employee->getEmployees();
      


  


 ?>

m_newEmployee.php

<?php

namespace app\model;
require_once "../task/vendor/autoload.php";
/**
 *
 */
class m_newEmployee

    function createTable()
    
        $database = new m_database;
        $conn = $database->connect();

        // sql to create table
        $sql = "CREATE TABLE IF NOT EXISTS employees (
        id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        employee VARCHAR(255) NOT NULL,
        created TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
        )";

        if ($conn->query($sql) === TRUE) 
            //echo "Table MyGuests created successfully";
         else 
            echo "Error creating table: " . $conn->error;
        

        $conn->close();
    


  function createEmployee($employee)
  

      $this->createTable();
       $sql = "INSERT INTO `employees`( `employee`) VALUES ('$employee')";
       if ($conn->query($sql) === TRUE) 

           $result = true;
           return $result;
        else 
           echo "Error inserting  " . $conn->error;
       
  


  function getEmployees()
  
      $database = new m_database;
      $conn = $database->connect();

      $sql = "SELECT * FROM `employees`";
      if ($result = $conn->query($sql) === TRUE) 

            //Initialize array variable
            $dbdata = array();

          //Fetch into associative array
            while ( $row = $result->fetch_assoc())  
            $dbdata[]=$row;
            

          //Print array in JSON format
           return json_encode($dbdata);
      

      else 
          echo "Error inserting  " . $conn->error;
      
    
  

composer.json


  "autoload":
    "psr-4":
      "":"app",
       "App\\":"app"
    



致命错误:未捕获的错误:在 C:\xampp\htdocs\task\app\controller\c_index.php:16 中找不到类“m_newEmployee”:16 堆栈跟踪:#0 C:\xampp\htdocs\task\index。 php(14): app\controller\c_index->​​loadEmployees() #1 main 在第 16 行的 C:\xampp\htdocs\task\app\controller\c_index.php 中抛出

【问题讨论】:

m_newEmployee.phpmodel 文件夹中?看起来您在命名空间中混合大小写,大多数地方是 app,但在您的自动加载器中是 App,我认为这可能是问题所在。 【参考方案1】:

导入命名空间 (use app\model;) 并不意味着您可以直接使用此命名空间中的模型。您需要指定命名空间(使用导入的短名称):

namespace app\controller;
use app\model;
// ...
$employee = new model\m_newEmployee();

或者直接导入模型:

namespace app\controller;
use app\model\m_newEmployee;
// ...
$employee = new m_newEmployee();

【讨论】:

那么你也有自动加载的问题。确保命名空间和类名与文件路径(包括大小写)匹配,并尝试从 composer.json 中删除 "":"app",

以上是关于在另一个命名空间中自动加载命名空间时出错的主要内容,如果未能解决你的问题,请参考以下文章

如何在另一个 C++ 命名空间内的全局命名空间中定义朋友?

php使用命名空间时自动加载机制

调用在另一个命名空间中定义的 PHP 函数,不带前缀

在 PHP 5.3 中使用命名空间自动加载?

2)thinkphp的带有命名空间的自动加载机制

使用命名空间和自动加载器找不到类