2

我正在尝试创建一个 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);
}
4

4 回答 4

1

loadPlugin.php您可以尝试使用以下代码创建一个名为 的文件,而不是调用该函数:

if( file_exists("scripts/plugins/".$name)) include("scripts/plugins/".$name));
elseif( strtolower($debug) == "d") trigger_error("....");

然后,加载插件:

$name = "pluginName"; include("loadPlugin.php");

您可以根据需要多次包含单个文件,只要它们不尝试重新定义函数即可。所以这基本上就像在全局范围内调用的函数一样工作。

于 2012-12-04T02:56:38.637 回答
1

加载具有功能的文件似乎很不稳定。为什么不创建类并采用面向对象的方法?

您可以加载可在整个代码中重用的对象。您甚至可以实现一个接口,该接口将保证在所有插件中存在某些方法和属性,而不管是谁开发它们。

就“全局”而言,我可以想到几种不同的路径,您可以考虑使用会话变量来存储每次加载新页面时填充对象的信息的持久性。甚至将对象本身存储到会话中(这不是最佳实践,但仍然可能)。

于 2012-12-04T03:18:09.843 回答
1

好吧,我遇到了类似的问题,并决定寻找可重用和可扩展的东西。所以,我只是为了演示科林的答案而为你修剪了它。代码可以改进:)

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


 }

  ?>

It uses PHP's autoload functions, so please make sure you have them. To resolve conflicts, i added a small registry class(sort of key/value store for unique variables and functions) that fixed conflicts. It Also improved performance. Might be an overkill for your kind of work, but it helped me since mine was quite a big project.

于 2012-12-04T03:40:57.067 回答
0

创建全局数组,例如 $pluginVars 并在插件文件内部存储您想在此数组外部使用的所有变量。

于 2012-12-04T02:59:09.627 回答