gpt4 book ai didi

传递包含文件的 PHP 函数

转载 作者:行者123 更新时间:2023-11-27 22:36:05 25 4
gpt4 key购买 nike

我正在尝试制作一个 loadPlugin(plugin) 函数,该函数将从插件文件夹中获取并获取 php 文件,并将其变量/函数加载到站点中。

问题是我们都知道函数不是全局的,这提出了我的问题。

因为可以包含任何文件,所以我不能将文件中的每个变量都设置为全局变量,因为它们可以是随机的和无限的,我希望这样可以使文件中的任何函数都可以在页面的任何位置使用。

关于如何执行此操作的任何建议都很棒。谢谢!

这是我目前所拥有的:

function loadPlugin($name,$debug='') {
if(file_exists("scripts/plugins/".$name)) {
include("scripts/plugins/".$name);
} else if(strtolower($debug)=='d') trigger_error($name." does not exists in the plugins folder.", E_USER_ERROR);
}

最佳答案

好吧,我遇到了类似的问题并决定寻求可重用和可扩展的东西。所以,我只是为你整理了一下,只是为了演示科林的回答。虽然可以改进代码:)

<?php
/**
* Autoloader
* @Usage:
* // set autoload paths
* Loader::setPaths(
* array("interface_path"=>dirname(__FILE__). "/core"),
* array("plugin_path"=>"/var/www/awesome-app/plugins"),
* array("controller_path"=>dirname(__FILE__). "/controllers")
* );
*
*
* // Now, the magic
* Loader::registerAutoloads();
*/

class Loader{

protected static $interfacePath = '';
protected static $pluginPath = '';
protected static $controllerPath = '';

/**
* Set paths to autoload classes
*
* @param string $application
* @param string $library
* @todo this part can be cleaner/smarter with less code.
* Replace "" for with constants as default folders to search
*/
public static function setPaths($autoload_paths= null)
{
if(is_array($autoload_paths)){
self::$interfacePath = array_key_exists("interface_path", $autload_paths) ?
$autoload_paths["interface_path"] : "";

self::$interfacePath = array_key_exists("plugin_path", $autload_paths) ?
$autoload_paths["plugin_path"] : "";

self::$interfacePath = array_key_exists("controller_path", $autload_paths) ?
$autoload_paths["controller_path"] : "";

}
}


/**
* Registers autoload functions
*
*/
public static function registerAutoloads() {
spl_autoload_register('Loader::loadInterface');
spl_autoload_register('Loader::loadPlugin');
spl_autoload_register('Loader::loadController');
if ( function_exists('__autoload') ) {
spl_autoload_register('__autoload');
}
}

/**
* Checks if a given file exists and load it
*
* @param string $filename
* @return bool
*/
protected static function check($filename)
{
if(file_exists($filename)){
include_once $filename;
return true;
}
return false;
}


/**
* Interface Loader
*
* @param string $className
* @return bool
*/
static function loadInterface($className)
{
return self::check(
sprintf('%s/%s_interface.php',self::$interfacePath, low($className))
);
}


/**
* Plugin Loader
*
* @param string $className
* @return bool
*/
static function loadPlugin($className)
{
return self::check(
sprintf('%s/%s_plugin.php',self::$pluginPath,low($className))
);
}



/**
* Controller Loader.
*
* @param string $className
* @return bool
*/
static function loadController($className){
$fileName = camelCaseToUnderscore($className);
return self::check(
sprintf('%s/%s_controller.php',self::$controllerPath,$fileName)
);
}


}

?>

它使用了 PHP 的自动加载功能,因此请确保您拥有这些功能。为了解决冲突,我添加了一个小的注册表类(一种用于唯一变量和函数的键/值存储)来修复冲突。它还提高了性能。对于您的工作类型来说可能有点矫枉过正,但它对我很有帮助,因为我的元素相当大。

关于传递包含文件的 PHP 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13695282/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com