无法重新声明类 - 检查类是否已存在

时间:2012-06-11 23:44:44

标签: php oop class

我正在使用一个两次调用同一个类并抛出错误的脚本:

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,因此Class位于Snippet而不是实际文件中。这就是他们称之为片段的方式:

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

我需要第二次打电话来获得不同的结果。

EDIT2:

这是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类里面的函数加密,我应该收到两个不同的结果。

4 个答案:

答案 0 :(得分:5)

redeclare class错误不是由创建类的新实例引起的,而是通过在同一符号上调用class运算符来调用它。您可能多次包含urlConverter类定义文件。

答案 1 :(得分:5)

在使用更新后的代码时,请将类文件更改为:

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

答案 2 :(得分:2)

看起来定义类的文件被多次包含,这就是为什么你得到第一个错误(不能重新声明类)。

/var/www/core/cache/includes/elements/modsnippet/23.include.cache.php14似乎是多次包含该类的内容。如果可能,请将include更改为include_once,这样您就不会多次定义该类。

要进一步调试(而不是看到500内部服务器错误),请尝试尽早将以下内容添加到您的代码中:

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

否则,请检查服务器error_log(Apache),看看是否有关于500错误的任何有用信息。

答案 3 :(得分:2)

如果您无法修改类文件进入CMS的方式(使用require_onceinclude_once),请修改您的代码段:

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

当然,如果您在同一个文件中还有其他内容,则需要确保它不会尝试运行两次。