4

同じクラスを 2 回呼び出してエラーをスローするスクリプトを使用しています。

Fatal: Cannot redeclare class urlConverter (/var/www/core/cache/includes/elements/modsnippet/23.include.cache.php:14)

次のコードを配置しようとしました:

if( !class_exists( 'urlConverter', false ) )
{
    $urlConverter = new urlConverter( $modx );
}

ただし、私が使用している CMS はエラー 500 を報告しており、そのエラーをスローしている理由をログで確認できませんでした。

そのクラスがすでに正しく宣言されているかどうかを確認する方法を知っている人はいますか?

編集:

私はCMSを使用しているため、クラスは実際のファイルではなくスニペットに格納されています。これは、彼らがスニペットを呼び出す方法です。

$data['viewonlinelink'] = $this->modx->runSnippet( 'urlConverter', array(
                                            'action' => 'encrypt',
                                            'string' => http_build_query( $string ) ) );

別の結果を得るには、もう一度呼び出す必要があります。

編集2:

ここにurlConverterがあります:

<?php
class urlConverter {

public $modx;

public function __construct( modX &$modx )
{
    $this->modx =& $modx;
}


public function action( $scriptProperties )
{
    return $this->$scriptProperties['action']( $scriptProperties['string'] );
}

private function encrypt( $str )
{
    return $str;
}


private function decrypt( $str )
{
      return $str;
}


}
}
 $urlConverter = new urlConverter( $modx );
 return $urlConverter->action( $scriptProperties );

別のスクリプトから、次のように呼び出します。

    $data['viewonlinelink'] = $this->modx->runSnippet( 'urlConverter', array(
                                            'action' => 'encrypt',
                                            'string' => http_build_query( $string ) ) );
    $data['confirmonline']  = $this->modx->runSnippet( 'urlConverter', array(
                                            'action' => 'encrypt',
                                            'string' => http_build_query( $reversed ) ) );

urlConverter クラス内で関数 encrypt を実行すると、2 つの異なる結果が返されます。

4

4 に答える 4

9

更新したコードを使用する際に、クラス ファイルを次のように変更します。

<?php
if(!class_exists('urlConverter')){
    class urlConverter {

        public $modx;

        public function __construct( modX &$modx ){
            $this->modx =& $modx;
        }
        public function action( $scriptProperties ){
            return $this->$scriptProperties['action']( $scriptProperties['string'] );
        }

        private function encrypt( $str ){
            return $str;
        }


        private function decrypt( $str ){
          return $str;
        }

    }
 }
$urlConverter = new urlConverter( $modx );
return $urlConverter->action( $scriptProperties );
于 2012-06-12T00:04:33.023 に答える
5

このエラーは、クラスの新しいインスタンスを作成することによって発生するのではなく、同じシンボルで演算子をredeclare class呼び出すことによって呼び出されます。クラス定義ファイルを複数回インクルードclassしている可能性があります。urlConverter

于 2012-06-11T23:48:17.083 に答える
3

クラス ファイルを CMS に取り込む方法を (require_onceまたはを使用してinclude_once) 変更できない場合は、スニペットを次のように変更します。

if( !class_exists( 'urlConverter' ) ) {
    class urlConverter {
        /* Build class */
    }
}

もちろん、同じファイルに何か他のものがある場合は、2 回実行されないようにする必要があります。

于 2012-06-11T23:51:22.490 に答える
2

クラスを定義するファイルが複数回含まれているように見えるため、最初のエラーが発生しています (クラスを再宣言できません)。

/var/www/core/cache/includes/elements/modsnippet/23.include.cache.php14は、クラスを複数回含むものと思われます。可能であれば、をに変更しincludeinclude_once、クラスを複数回定義しないようにします。

(500 内部サーバー エラーを表示する代わりに) さらにデバッグするには、できるだけ早くコードに次を追加してみてください。

error_reporting(E_ALL);
ini_set('display_errors', 1);

それ以外の場合は、サーバーerror_log(Apache) をチェックして、500 エラーに関する有用な情報があるかどうかを確認してください。

于 2012-06-11T23:48:02.523 に答える