在另一个命名空间中自动加载命名空间时出错
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.php
在model
文件夹中?看起来您在命名空间中混合大小写,大多数地方是 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",
。以上是关于在另一个命名空间中自动加载命名空间时出错的主要内容,如果未能解决你的问题,请参考以下文章