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"