Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.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_.htaccess_Class_Include_Autoload - Fatal编程技术网

Php 从不同的文件和目录自动加载类和函数

Php 从不同的文件和目录自动加载类和函数,php,.htaccess,class,include,autoload,Php,.htaccess,Class,Include,Autoload,我有这个自动加载代码: function __autoload($class_name) { //class directories $directorys = array( './Controls/', './Config/', './Utility/' ); //for each directory foreach($directorys as $directory) { //se

我有这个自动加载代码:

function __autoload($class_name)
{
    //class directories
    $directorys = array(
        './Controls/',
        './Config/',
        './Utility/'
    );
    //for each directory
    foreach($directorys as $directory)
    {
        //see if the file exsists
        if(file_exists($directory.$class_name . '.php'))
        {
            require_once($directory.$class_name . '.php');
            //only require the class once, so quit after to save effort (if you got more, then name them something else
            return;
        }
    }
}
我有三个目录,它们保存着我所有的类和函数

我可以在
控件
目录中创建一个单独的自动加载文件,并使用它加载其他php文件中的所有函数或类吗?我是说,例如
/portal/main/index.php中的
index.php
文件

是否可以加载index.php文件中的
控件
配置
类,而不包括
index.php
文件中的任何文件

我的意思是自动加载自动理解哪个文件正在请求一个类或函数,并包含该文件

更新代码:

function __autoload($class_name)
{
    //class directories
    $directorys = array(
        '/Controls/',
        '/Config/',
        '/Utility/'
    );
    //for each directory

    $ds = "/"; //Directory Seperator
    $dir = dirname(__DIR__); //Get Current file path
    $windir = "\\"; //Windows Directory Seperator
    $path = str_replace($windir, $ds, $dir);

    foreach($directorys as $directory)
    {
        //see if the file exsists
        if(file_exists( $path . $directory . $class_name . '.php'))
        {
            require_once( $path . $directory . $class_name . '.php');
            //only require the class once, so quit after to save effort (if you got more, then name them something else
            return;
        }
    }
}
我已经更新了代码,它包含了文件,但我唯一的问题是这个函数没有自动运行

例如,我的自动加载文件位于:
root/Controls/autoload.php
我需要一些类和函数:
root/portal/index.php

当我在index.php中定义类时,我得到一个错误,该文件不存在 我应该在
index.php

如何使自动加载智能化,而我不应该将其包含在包含类的每个文件中

请帮帮我。 提前谢谢

  • 你的程序和你一样聪明。 如果你梦想解决一个主流语言无法解决的问题,那么问题在于你的梦想,而不是语言

  • 要自动加载PHP代码,请在PHP.ini中将其设置为自动加载脚本。 或者,您可以将其作为集中入口点,并与其他车辆直接通行

  • 这是个坏习惯。这两种方法都依赖于服务器配置,例如.htaccess,但并不总是可用。 您还可能重写现有配置或无法重写某些路径

    您应该手动集中PHP请求(并封闭非入口点),或者在每个入口点要求一次

  • PHP支持自动加载功能。 如果您不想费心编写包含函数的代码,请包含您可能需要的所有函数
  • 看看维基百科、Magento或WordPress。 它们有成百上千的全局函数

    不要担心包括-信任您的磁盘缓存并启用。 静态包含是非常重要的,使用操作码缓存可能比条件加载更快

  • 如果一个文件中有多个类/函数,我知道没有动态语言能够神奇地选择要包含的正确文件。 你的自动装弹机看起来很漂亮
  • 您可以在PHP中动态定义任何内容。 除非PHP真的运行代码,否则它永远无法确定它将得到什么。 自动加载程序只是相信文件名是文件中内容的正确和完整声明

    由于自动加载程序扫描所有文件夹,您可能希望在第一次运行时创建静态文件映射,并使用该映射进行后续加载。 当然,假设您不打算使用PHP动态创建类文件


    简单的手动解决方案:将
    自动加载
    文件放在项目根目录中,并将其包含在索引文件中,这样就可以完成这项工作

    但是如果您想使用
    htaccess
    php.ini
    : 将名为
    .user.ini
    的文件放入文档根目录,并在其中添加指令:

    auto_prepend_file = /home/user/domain.com/init.php
    
    该文件必须位于PHP的include_路径内。因此,必须将文件的目录设置为php.ini中的include_路径,或者使用php_value语句在.htaccess中进行设置

    php_value include_path ".:/path/to/file_directory"
    php_value auto_prepend_file "file.php
    
    如果在.htaccess中使用上述方法,请确保在中从php.ini复制include_路径,并将:
    /path_添加到/file_目录
    ,这样就不会丢失任何已经需要的include

    或者,只需添加:
    /path/to/file\u目录,即可将路径直接包含在php.ini中

    更新

    如果无法修改include\u路径,可以尝试指定自动预结束文件的相对路径。这应该可以工作,因为发送的文件路径的处理方式与使用require()调用的相同:


    使用
    set_include_path
    hi@anonymous在哪个文件中应该使用set_include_path?在
    控件中创建一个自动加载文件,如下
    $directorys=array('./Controls/','./Config/','./Utility/',get_include_path());set_include_path(内爆(路径分隔符,$directorys))我更新了上面的代码,对吗?不过,我在portal/main/index.php文件中的index.php文件中遇到了错误。感谢您提供了完整的解释性答案,但是根据您的答案,第3部分手动包含文件可以快速完成吗?速度毋庸置疑,但写每一篇文章都是浪费时间!!!symphony和codeigniter框架呢?他们也在使用自动装弹机。我正在创建我自己的框架,我想使用autoloader。使用autoloader的想法是在项目中的任何地方编写和使用类,而不必费心包含所需的文件或文件classes@anonymox注意,我说的包括函数,而不是类。即使是我提到的软件也将大部分功能放在了课堂上。我假设你的自动加载器可以自动加载单个类文件,只要加载器本身就可以了,我在这里有点困惑:如果我在代码开始时加载自动加载文件,例如,如果我将其包含在index.php文件中,第一个索引文件会加载其余文件和页面的所有类等吗?而不是将其包含在php中。ini@anonymox除非您的“其他文件和页面”是通过index.php访问的,否则index.php中不会有加载程序。这就是为什么大多数PHP程序设计为强制所有请求通过index.PHP——我提到的“集中式入口点”。这就像是一个有一个主门的房子,而不是每个房间都有外门的房子。后者是一个管理/重建的噩梦。您的简单解决方案有效,但在每个子目录中都需要
    
    php_value auto_prepend_file "./file.php"