2016-06-01 68 views
0

心中已经奇异proble ...如果我有这样的文件:PHP类没有找到,但它是在文件夹中,它也包括

<?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(); 

它说,

Class 'ErrorManager' not found in path

我想任何事情,当我心中已经想试试这个:

<?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之外的所有类?
谢谢!

在这里,有错误管理类代码(它有空白构造类似检查类)

<?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!"; 
} 
} 

我包括文件夹的截图太
enter image description here

我现在想这个,与自动装入:
这是电子商务类:

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): failed to open stream: No such file or directory in

+0

你能不能从文件中发布ErrorManager代码请 – Brett

+0

@Brett当然,它来了! – ProtoTyPus

+0

../utilities/ErrorManager.php,你确定这是正确的路径。utilities文件夹与classes文件夹位于同一个文件夹中? – Brett

回答

2

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。它使得类依赖管理变得更容易。

+0

那么Checker为什么被包括在内? – ProtoTyPus

+0

我看过编辑了。我的问题是在foreach循环中,手册包含了作品! – ProtoTyPus

+0

我首先完成了编辑,使其更一般。如果之前已成功包含其他类,那么在ErrorManager加载之前,其他类中可能会存在依赖关系。甚至可以有一个自动加载/ spl_autoload机制。 –

相关问题