5

__autoload を使用するようにすべてのコードを変更して、それが joomla オートローダーと競合することを確認しました。場合によっては、アプリを joomla と統合してユーザーを登録します。

明らかに多くのオートローダーを許可する spl_autoload_register() を見つけました。

私は何をすべきか?

更新:これはjoomlaが行うことです

/library/loader.php からこのファイルを読み込みます

function __autoload($class)
{
    if(JLoader::load($class)) {
        return true;
    }
    return false;
}

更新 2:

OK、呼び出した Joomla ライブラリをロードした直後

    require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
    require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );

    //autoloader so that it does not interfere with mine
    spl_autoload_register('__autoload');

これは私のオートロードがどのように見えるかです:

<?php

//IMPORT
function myAutoload($class_name)
{
    $path = str_replace('_', '/', $class_name);
    include $path . '.php';
}

?>

spl_autoload_register('myAutoload',false,true);

私が最初に呼び出され、1 秒後に joomla が呼び出されますが、アプリはまだ Joomla クラスを見つけることができません。

更新 3:

実行後:

echo "PRE: myAutoload:" . spl_autoload_functions() . "<br />";
spl_autoload_register('myAutoload',false,true);
echo "POST: myAutoload:" . spl_autoload_functions() . "<br />";

    echo "PRE: JoomlaAutoLoad:" . spl_autoload_functions() . "<br />";
    //autoloader so that it does not interfere with mine
    spl_autoload_register('__autoload');
    echo "POST: JoomlaAutoLoad:" . spl_autoload_functions() . "<br />";

私の出力は次のとおりです。 PRE: myAutoload: POST: myAutoload:Array

更新 4:

Joomla のインポートを次のように変更する必要がありました。

    require_once ( JPATH_BASE .DS.'libraries'.DS.'loader.php' );
    echo "PRE: JoomlaAutoLoad:" . var_dump(spl_autoload_functions()) . "<br />";
    //autoloader so that it does not interfere with mine
    spl_autoload_register('__autoload');

            echo "POST: JoomlaAutoLoad:" . var_dump(spl_autoload_functions()) . "<br />";

    require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
    require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );

ここに出力があります

PRE: myAutoload:
array
  0 => string 'myAutoload' (length=10)
POST: myAutoload:
array
  0 => string 'myAutoload' (length=10)
PRE: JoomlaAutoLoad:
array
  0 => string 'myAutoload' (length=10)
  1 => string '__autoload' (length=10)
POST: JoomlaAutoLoad:

これらのJoomlaファイルを含めた後、私はそれを解決しました

    require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
    require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );

spl_autoload_functions() は何も返さないため、どういうわけか joomla が詰め込んでいます。

4

4 に答える 4

3

どの autoload 関数が他のものよりも優先されるかを決定し、それspl_autoload_register()に応じて使用する必要があります (3 番目の引数を見てください)。Joomlaのオートロード機能はどのように登録されていますか?

于 2010-06-14T13:07:21.963 に答える
2

記録のために、このソリューションを試しただけで、Joomla 1.5 で動作します。

  1. \libraries\loader.php(160) に移動して置き換えます

     function __autoload {...}
    

    spl_autoload_register(array('JLoader', 'load'));
    
  2. これで、Joomla 側の修正が完了しました。これで実際には完了です。ステップ 2 はありません。ただし、記録のために、独自のライブラリも正常に動作し、spl_autoload_register を使用していることを再確認します。誰もがうまくやっていれば、__autoload と呼ばれる関数への参照はもうどこにもないはずです。

出来上がり。終わり。

これが機能する理由の明確で簡潔な説明を読むには、ここにアクセスしてください。

http://www.nicollet.net/2010/06/autoloading-be-friendly-to-intruders/

于 2011-07-26T09:30:07.137 に答える
2

私はこの質問に対する最も簡単な答えを持っています.少なくともjoomla 1.5.22では毎回私のために働いていました::

require_once ( JPATH_SITE .DS.'libraries'.DS.'loader.php' );
spl_autoload_register('__autoload');

これらの2行を独自の自動ロードレジスタの前に配置して、スタックでjoomlaを優先します

spl_autoload_register('DataMapper::autoload');
于 2011-03-12T13:44:54.463 に答える
0

私はヘルパーでこのメソッドを呼び出すだけで、別の方法でそれを行いました:

public static function configureZend(){
    $params = self::getParameters();
    $zf_path = $params->get('zend_location');//this should be the zend framework directory location
    define( 'ZFLIBPATH', $zf_path );
    set_include_path( ZFLIBPATH );
    require_once 'Zend/Loader/Autoloader.php';
    $loader = Zend_Loader_Autoloader::getInstance();
    $loader->pushAutoloader(array('JLoader','load'),'');
}

正常に動作し、joomla コアのソースを変更する必要はなく、すべての zend クラスが正常に動作します。

于 2011-02-05T20:00:20.123 に答える