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

时间:2015-11-22 07:06:50

标签: php .htaccess class include autoload

我有这个自动加载代码:

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;
        }
    }
}

我有三个目录,他们持有我所有的类和函数。

我可以在Controls目录中创建一个自动加载文件,并使用它来加载其他php文件中的所有函数或类,我的意思是index.php

中的/portal/main/index.php文件

是否可以在index.php文件中加载controlsconfig的类,而不包括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中定义类时,我得到文件不存在的错误 我应该手动调用autoload.php

中的index.php文件

我怎样才能使自动加载智能,我不应该将它包含在包含类的每个文件中?

请帮帮我。 提前谢谢

2 个答案:

答案 0 :(得分:6)

  1. 您的计划与您一样聪明。 如果你梦想解决超出主流语言能力的问题,问题就在于你的梦想,而不是语言。

  2. 要自动加载PHP代码,请将php.ini中的auto_prepend_file设置为自动加载器脚本。 或者,您可以将其设为集中入口点,并使用mod_rewirte指示流量。

  3.   

    这是不好的做法。这两种方法都依赖于服务器配置,例如.htaccess,并不总是可用。   您也可以覆盖现有的配置或无法重写某些路径。

         

    您应该手动集中PHP请求(并封锁非入口点)或每个入口点的require_once。

    1. PHP does not支持自动加载功能。 如果您不想编写包含内容,请包括您可能需要的所有功能。
    2.   

      查看维基百科,Magento或WordPress。   它们拥有数百甚至数千个全局函数。

           

      不要担心包括 - 信任您的磁盘缓存并启用opcode cache。   静态包含是pretty fast,并且对于操作码缓存,它可能比条件加载更快。

      1. 如果文件中有多个类/函数,我知道没有动态语言能够神奇地选择要包含的正确文件。 您的自动加载器看起来非常standard
      2.   

        您可以在PHP中动态定义任何内容。   除非它真正运行代码,否则PHP永远不会确信会得到什么。   自动加载器只是信任文件名,因为它正确且完整地声明了文件中的内容。

             

        由于您的自动加载器会扫描所有文件夹,因此您可能希望在首次运行时创建静态文件映射,并使用映射进行子序列加载。   假设你不打算用PHP动态创建类文件。

答案 1 :(得分:6)

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

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

auto_prepend_file = /home/user/domain.com/init.php

该文件必须位于PHP的include_path中。因此,您必须将文件的目录设置为php.ini中的include_path,或者使用php_value语句在.htaccess中进行。

php_value include_path ".:/path/to/file_directory"
php_value auto_prepend_file "file.php

如果您在.htaccess中使用上述方法,请务必从php.ini中复制include_path并添加:/path_to/file_directory,这样您就不会丢失任何已经包含的内容。

或者,只需添加:/path/to/file_directory to include_path directly in the php.ini

<强>更新

如果无法修改include_path,则可以尝试指定auto_prepend_file的相对路径。这应该有效,因为发送的文件路径的处理方式与使用require():

调用的方式完全相同
php_value auto_prepend_file "./file.php"