Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如果每个文件中未使用相同的类,则“找不到类”错误_Php - Fatal编程技术网

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

关于

我使用的是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 '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
的类,并将您的类安排到逻辑组中。这个一旦有了自动加载器,并将类排列到与其名称匹配的文件中,您就永远不会考虑
包含
要求
,您只需假设它们存在就可以编写代码。