2

プラグインフォルダーからphpファイルを取得して取得し、その変数/関数をサイトにロードするloadPlugin(plugin)関数を作成しようとしています。

問題は、私たち全員が知っているように、関数がグローバルではないため、私の問題が発生することです。

任意のファイルを含めることができるため、ファイル内の各変数をランダムで無限にすることができるため、ファイル内の各変数をグローバルにすることはできません。ファイル内の任意の関数をページのどこでも使用できるようにしたいと考えています。

これを行う方法についての提案は素晴らしいでしょう。ありがとう!

これは私がこれまでに持っているものです:

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

さて、私は同様の問題に直面し、再利用可能で拡張可能なものを選ぶことにしました。それで、コリンの答えをデモするためだけにそれをトリミングしました。ただし、コードは改善できます:)

<?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のオートロード機能を利用していますので、そちらをご用意ください。競合を解決するために、競合を修正する小さなレジストリ クラス (一意の変数と関数のキー/値ストアの一種) を追加しました。また、パフォーマンスが向上しました。あなたのような仕事にはやり過ぎかもしれませんが、私のプロジェクトはかなり大きなプロジェクトだったので助かりました。

于 2012-12-04T03:40:57.067 に答える
1

機能を含むファイルをロードすると、不安定に見えます。クラスを作成して、オブジェクト指向のアプローチをとってみませんか?

コード全体で再利用できるオブジェクトをロードできます。誰が開発したかに関係なく、すべてのプラグインで特定のメソッドとプロパティの存在を保証するインターフェイスを実装することもできます。

「グローバル」に関する限り、セッション変数を使用して、新しいページをロードするたびにオブジェクトを設定するための情報を保存することを中心に展開する永続性に関して、いくつかの異なるパスを考えることができます。または、オブジェクト自体をセッションに格納することもできます (これはベスト プラクティスではありませんが、それでも可能です)。

于 2012-12-04T03:18:09.843 に答える
0

たとえば $pluginVars などのグローバル配列を作成し、プラグイン ファイル内にすべての変数を保存します。この配列の外側で使用したいと考えています。

于 2012-12-04T02:59:09.627 に答える