Php 如果每个文件中未使用相同的类,则“找不到类”错误
关于 我使用的是PHP7.4。没有使用任何框架。有两个文件。1.Index.php.2。LoginController.php 请注意,这行代码Php 如果每个文件中未使用相同的类,则“找不到类”错误,php,Php,关于 我使用的是PHP7.4。没有使用任何框架。有两个文件。1.Index.php.2。LoginController.php 请注意,这行代码使用application\Loading\AppResource 有没有办法只在index.php中声明这个类?我的意思是,我可以只在index.php中执行一次,而不是在每个文件中声明它吗 Index.php文件 include_once 'application/Config/AppConfig.php'; include_once 'applic
使用application\Loading\AppResource两个文件中都需要code>
有没有办法只在index.php中声明这个类?我的意思是,我可以只在index.php中执行一次,而不是在每个文件中声明它吗
Index.php文件
include_once 'application/Config/AppConfig.php';
include_once 'application/Config/RouteNamesConfig.php';
include_once 'application/Loading/AppResource.php';
use application\Config\AppConfig;
use application\Loading\AppResource;
use application\Config\RouteNamesConfig;
$pageName = str_replace(AppConfig::requestUri, "", $_SERVER["REQUEST_URI"]);
if($pageName == RouteNamesConfig::LoginPage) {
AppResource::Load("Controllers", "Auth.LoginController");
LoginController::CreateView();
}
use application\Loading\AppResource;
class LoginController {
public static function CreateView() {
AppResource::Load("Views", "Auth.Login.Main");
}
}
LoginController类存在于另一个文件中
include_once 'application/Config/AppConfig.php';
include_once 'application/Config/RouteNamesConfig.php';
include_once 'application/Loading/AppResource.php';
use application\Config\AppConfig;
use application\Loading\AppResource;
use application\Config\RouteNamesConfig;
$pageName = str_replace(AppConfig::requestUri, "", $_SERVER["REQUEST_URI"]);
if($pageName == RouteNamesConfig::LoginPage) {
AppResource::Load("Controllers", "Auth.LoginController");
LoginController::CreateView();
}
use application\Loading\AppResource;
class LoginController {
public static function CreateView() {
AppResource::Load("Views", "Auth.Login.Main");
}
}
use
语句不“声明”类,而是声明。此别名仅在当前文件或命名空间块中有效
如果不是这样的话,它将破坏名称空间的意义,因为只要编写use application\Config\Exception
在任何文件中,类名Exception
将引用该类,而不是内置的Exception
,或其他命名空间中的某个类
另一方面,您根本不必编写任何use
语句;它们所做的只是为您提供一个在该文件中引用某些内容的快捷方式。重要的是,它们不会触发自动加载程序,也不会要求引用的类永远存在
因此,以下文件完全等效:
名称空间应用程序\控制器;
类登录控制器{
公共静态函数CreateView(){
\application\Loading\AppResource::Load(“视图”,“Auth.Login.Main”);
}
}
及
名称空间应用程序\控制器;
使用应用程序\加载\ AppResource;
类登录控制器{
公共静态函数CreateView(){
AppResource::Load(“视图”、“Auth.Login.Main”);
}
}
甚至
名称空间应用程序\控制器;
使用application\Loading\AppResource作为ALAR;
类登录控制器{
公共静态函数CreateView(){
加载(“视图”,“Auth.Login.Main”);
}
}
无论您使用哪一种,您都可以在应用程序的某个地方实际包含全名为application\Loading\AppResource
的类的定义
通常的方法是在代码中第一次引用类时,确定要包含哪个文件
越来越多的情况下,即使这不是手工编写的,而是将项目配置为使用自动加载器,为您自己的代码和您使用的库生成自动加载器。为什么可能?每个文件都必须声明使用的类。那么,为什么不使用合适的自动加载程序呢?这至少有助于避免手动include_once
calls如果您不想在每个文件中使用所需的每个类,那么就不要使用名称空间。“自动加载程序将立即加载所有文件”-不,为什么要这样做?您尝试过spl_自动加载吗?我是否应该删除所有名称空间,这样就只在顶层包含它一次,并在该范围下编写的所有类中使用它?这样,它将避免代码冗余。假设文件夹结构发生变化,这将导致所有类中的use
代码行发生变化。我的想法正确吗?@Pankaj如果这是个好主意,PHP根本就没有名称空间。更改文件夹结构应被视为与重命名类相同-您在需要改进应用程序时这样做,而不仅仅是因为您想这样做。事实上,我很抱歉,我一点也不确定,因此正在寻找您有价值的建议include/include_一旦
完成了类加载工作。加载的classed现在可以在该范围下访问(无需使用use
关键字)。正确的?那么,您不认为完全没有必要使用名称空间吗?请不要介意,我只是一个初学者。@Pankaj名称空间不是关于类的加载方式;它是关于如何命名的:它允许您同时拥有一个名为application\Loading\Config
的类和一个名为application\UserManagement\Config
的类,并将您的类安排到逻辑组中。这个一旦有了自动加载器,并将类排列到与其名称匹配的文件中,您就永远不会考虑包含和要求,您只需假设它们存在就可以编写代码。