我正在围绕PHP自动加载器。如果我有以下代码:
function __autoload($class) {require_once('scripts/classes/' . $class . '.class.php');}
只要我的类被命名为适合上面的路径,我仍然需要使用require_once
require_once('scripts/classes/session.class.php');
注意:我在网站的header()中加入了__autoloading(第一页加载。我是否需要将它包含在每个加载的页面上以使其功能正常工作?我会假设是的但是我不确定......
谢谢
答案 0 :(得分:2)
您需要在浏览器中加载的每个页面上定义__autoload
或调用spl_autoload_register
。因此,如果您的所有网页都使用相同的"标题",那么将它放在那里就足够了。
完成上述操作后,您无需在其他地方使用include
或require
:只需提及课程Session
,PHP就会使用自动加载功能查找它的定义是否还不知道。
答案 1 :(得分:1)
不,你应该使用include()
。如果该类尚未加载,则该类将仅包含 :
从PHP手册:
您可以定义一个自动调用的__autoload()函数 如果您正在尝试使用尚未使用的类/接口 已定义。
不,您可以在整个应用程序中只包含一次自动加载器功能。
最好使用spl_autoload_register()代替__autoload()
。
答案 2 :(得分:0)
您可以将此文件包含在脚本的开头,然后只需设置目录级别
而不是此常量:WP_CONTENT_DIR
这将自动包括所需的任何文件
<?php
class autoload
{
private static function updatePhpFiles($dir_level, $php_files_json_name)
{
/**Get all files and directory using iterator.*/
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir_level));
$filePaths = array();
/**Get all php files in this directory level.*/
foreach ($iterator as $path) {
if (is_string(strval($path)) and pathinfo($path, PATHINFO_EXTENSION) == 'php') {
$filePaths[] = strval($path);
}
}
/**Encode and save php files dir in a local json file */
$fileOpen = fopen($dir_level . DIRECTORY_SEPARATOR . $php_files_json_name, 'w');
fwrite($fileOpen, json_encode($filePaths));
fclose($fileOpen);
}
private static function includeMatchingFiles($dir_level, $php_files_json_name, $class_file_name)
{
$files = json_decode(file_get_contents($dir_level . DIRECTORY_SEPARATOR . $php_files_json_name), true);
$inc_is_done = false;
/**Include matching files here.*/
foreach ($files as $path) {
if (stripos($path, $class_file_name)) {
require_once $path;
$inc_is_done = true;
}
}
return $inc_is_done;
}
public static function include_system_files($dir_level, $class_name)
{
$php_files_json = 'phpfiles.json';
$class_file_name = $class_name . '.php';
/**Include required php files.*/
if (is_file($dir_level . DIRECTORY_SEPARATOR . $php_files_json)) {
if (self::includeMatchingFiles($dir_level,$php_files_json, $class_file_name)) {
return true;
} else {
self::updatePhpFiles($dir_level, $php_files_json);
return self::includeMatchingFiles($dir_level, $php_files_json, $class_file_name);
}
} else {
self::updatePhpFiles($dir_level, $php_files_json);
return self::includeMatchingFiles($dir_level, $php_files_json, $class_file_name);
}
}
}
/**
* Register autoloader.
*/
spl_autoload_register(function ($className) {
autoload::include_system_files(WP_CONTENT_DIR, $className);
});