我想编写一个类自动加载器,用于wordpress插件。这个插件将安装在多个站点上,我希望尽量减少与其他插件发生冲突的可能性。
自动加载器将是这样的:
function __autoload($name) {
//some code here
}
我的主要问题是,如果另一个类也使用这样的函数会发生什么?我认为一定会有问题。避免这样的事情最好的方法是什么?
我正在尝试不使用命名空间,因此代码也适用于以前版本的php。
答案 0 :(得分:1)
我建议使用命名空间和PSR-4。您只需复制this autoloader example from FIG。
但是如果你不想,你可以使用自动加载器like this one来定义WP类名称的约定,并使用它来查找类文件。
因此,例如,如果您调用'Main'类,则此自动加载器将尝试从路径中包含类文件:
<plugin-path>/class-main.php
答案 1 :(得分:1)
使用像这样的一些实现。
<tr ng-repeat="search in searchLocations | orderBy:sortType:sortReverse">
<td>{{ search.locationName }}</td>
<td>{{ search.distance}}</td>
</tr>
此自动加载器基本上已注册,具有以下功能:
现在,如果您想要以OOP方式进行,只需在类中添加自动加载器功能即可。 (即:myAutoloaderClass)并从构造函数中调用它。 然后只需在functions.php中添加一行
function TR_Autoloader($className)
{
$assetList = array(
get_stylesheet_directory() . '/vendor/log4php/Logger.php',
// added to fix woocommerce wp_email class not found issue
WP_PLUGIN_DIR . '/woocommerce/includes/libraries/class-emogrifier.php'
// add more paths if needed.
);
// normalized classes first.
$path = get_stylesheet_directory() . '/classes/class-';
$fullPath = $path . $className . '.php';
if (file_exists($fullPath)) {
include_once $fullPath;
}
if (class_exists($className)) {
return;
} else { // read the rest of the asset locations.
foreach ($assetList as $currentAsset) {
if (is_dir($currentAsset)) {
foreach (new DirectoryIterator($currentAsset) as $currentFile)
{
if (!($currentFile->isDot() || ($currentFile->getExtension() <> "php")))
require_once $currentAsset . $currentFile->getFilename();
}
} elseif (is_file($currentAsset)) {
require_once $currentAsset;
}
}
}
}
spl_autoload_register('TR_Autoloader');
并添加构造函数
new myAutoloaderClass();
希望这会有所帮助。 HR