【问题标题】:PHP Class not found but it's in folder and it is also included未找到 PHP 类,但它在文件夹中,并且它也包含在内
【发布时间】:2016-09-30 04:51:25
【问题描述】:

我有一个奇怪的问题...如果我以这种方式包含文件:

<?php     
    session_start();
    session_regenerate_id();
    foreach (glob("../class/*.php") as $filename)
    {
        echo "$filename\n";
        include $filename;
    }
    foreach (glob("../utilities/*.php") as $filename) {
        echo "$filename\n";
        include $filename;
    }

class ECommerce {
    private $checker;
    private $errorManager;

    /**
     * ECommerce constructor.
     */
    function __construct() {
        $this->checker = new Checker();
        $this->errorManager = new ErrorManager();
    }

网站不工作,什么时候可以工作

$ecommerce = new ECommerce();

它说

在路径中找不到类“ErrorManager”

我什么都想,当我想试试这个时:

 <?php     
    session_start();
    session_regenerate_id();
    include "../class/Checker.php";
    include "../class/User.php";
    include "../utilities/ErrorManager.php";

class ECommerce {
    private $checker;
    private $errorManager;

    /**
     * ECommerce constructor.
     */
    function __construct() {
        $this->checker = new Checker();
        $this->errorManager = new ErrorManager();
    }

以这种方式,它可以工作,任何事情都会做它必须做的!
在我内心,“为什么”这个问题已经根深蒂固,我无法入睡(真的)。
为什么第一种方式适用于除 ErrorManager 之外的所有类?
之前谢谢你!

这里有 ErrorManager 类代码(它有类似 Checker 类的空白结构)

<?php
class ErrorManager
{
function __construct() {
}

function getErrorUserNameNotValid() {
    return "Nome inserito non valido";
}

function getErrorUserSurnameNotValid() {
    return "Cognome inserito non valido";
}

function getErrorUserEmailAlreadyExists() {
    return "Email inserita non valida!";
}

function getErrorUserEmailNotValid() {
    return "Email inserita non valida!";
}

function getErrorUserPasswordNotValid() {
    return "Password inserita non valida! Inserisci una password che sia lunga tra i 6 e i 50 caratteri!";
}

function getErrorUserAddressNotValid() {
    return "Indirizzo inserito non valido!";
}

function getErrorUserPhoneNumberNotValid() {
    return "Numero telefonico inserito non valido! Inserisci solo numeri, senza trattini o caratteri speciali!";
}
}

我也附上文件夹的截图

我现在正在尝试使用 AutoLoader:
这是电子商务类:

spl_autoload_register('MyAutoloader::ClassLoader');
spl_autoload_register('MyAutoloader::LibraryLoader');

这是在 MyAutoloaderClass 中

class MyAutoloader
{
public static function ClassLoader($className)
{
    $path = "../class/";
    include $path.$className.'.php';
}


public static function LibraryLoader($className)
{

    $path = __DIR__."/";
    include $path.$className.'.php';
}

}

上面写着

include(../class/ErrorManager.php): 无法打开流: 没有这样的文件或目录

【问题讨论】:

  • @Brett 当然来了!
  • ../utilities/ErrorManager.php 你确定这是正确的路径。实用程序文件夹与类文件夹位于同一文件夹中?
  • @Brett 是的!如果我包含一个 foreach 循环它不起作用,手动路径是 >_>
  • 第二个循环的回声是什么意思?是否与手动输入相匹配?
  • @Brett 不,它只显示“../utilities/Dispatcher.php”作为类,它不显示“../utilities/ErrorManager.php”!

标签: php file class include


【解决方案1】:

include 在相对路径上将根据被调用 PHP 脚本的路径搜索文件,而不是您调用包含的 PHP 文件。

即使您的电子商务课程在不同的位置使用,也能够包含在内,请尝试

include __DIR__ . '/' . $filename;

在较旧的 PHP 版本中,您可以使用 dirname(__FILE__) 而不是 __DIR__

ErrorManager.php 加载之前可能还有其他依赖项,例如在Dispatcher.php

如果您测试以下内容会发生什么?

include "../class/Checker.php";
include "../class/User.php";
include "../utilities/Dispatcher.php";
include "../utilities/ErrorManager.php";

考虑使用像spl_autoload_register 这样的类加载机制。它使类依赖管理变得更加容易。

【讨论】:

  • 那么为什么 Checker 被很好地收录了?
  • 我看过编辑。我的问题是在 foreach 循环中,手册包含工作!
  • 我首先完成了更一般的编辑。如果之前已经成功包含了其他类,那么在加载 ErrorManager 之前,其他类中可能存在依赖关系。甚至可以有一个 autoload/spl_autoload 机制。
  • ErrorManager 类仍然给我错误...我绝望了!
  • 打开您的错误日志文件。一个请求的完整日志是什么?
猜你喜欢
  • 2012-01-19
  • 1970-01-01
  • 2016-11-05
  • 2016-04-28
  • 2020-06-01
  • 2021-08-20
  • 1970-01-01
  • 2018-09-28
  • 2019-03-25
相关资源
最近更新 更多