致命错误:EasyBlogTableMediaManager :: bind()的声明必须与JTableInterface :: bind()的声明兼容

时间:2015-01-08 12:56:54

标签: php joomla easyblog

我对easyblog有疑问。当我尝试通过后端打开博客条目时,我收到以下错误:

  

致命错误:EasyBlogTableMediaManager :: bind()的声明必须与第46行的/home/mysit/public_html/localadvertiser/administrator/components/com_easyblog/tables/mediamanager.php中的JTableInterface :: bind()声明兼容

我正在运行Joomla 3.2.5 错误报告设置为“最大”。知道问题可能在这里吗?

这是发生错误的文件

class EasyBlogTableMediaManager extends EasyBlogTable
{
    var $id     = null;
    var $path   = '';
    var $type   = '';
    var $params = '';
    function __construct(& $db )
    {
        parent::__construct( '#__easyblog_mediamanager' , 'id' , $db );
    }
    public function bind( $data = array() )
    {
        return parent::bind( $data );
    }
    public function load( $path , $type )
    {
        $db     = EasyBlogHelper::db();
        $query  = 'SELECT * FROM ' . EasyBlogHelper::getHelper( 'SQL' )->nameQuote( $this->_tbl );
        $query  .= ' WHERE ' . EasyBlogHelper::getHelper( 'SQL' )->nameQuote( 'path' ) . '=' . $db->Quote( $path );
        $query  .= ' AND ' . EasyBlogHelper::getHelper( 'SQL' )->nameQuote( 'type' ) . '=' . $db->Quote( $type );
        $db->setQuery( $query );
        $obj    = $db->loadObject();
        return parent::bind( $obj );
    }
}

2 个答案:

答案 0 :(得分:0)

TLDR

是的我认为错误正在发生,因为您将错误报告设置为最大值,这可能会强制STRICT模式,如果您将级别设置为None它应该可以正常工作,因为这样做将display_errors设置为 0 。这也可能表示您在服务器上使用PHP 5.4或更高版本( A Good Thing ™)。

更长&更精确:

由于错误声明Declaration of EasyBlogTableMediaManager::bind() 必须JTableInterface类中的原始声明兼容(即相同/匹配)。

这告诉我们,扩展EasyBlogTableMediaManager的{​​{1}}作为父类返回EasyBlogTable(在JTable找到),其定义为:

/libraries/joomla/table/table.php

您会注意到它实现了abstract class JTable extends JObject implements JObservableInterface, JTableInterface ,这意味着原始JTableInterface必须与JTable->bind() JTableInterface的{​​{1}}声明匹配(在/libraries/joomla/table/interface.php找到)您将看到它在接口文件中定义为:

public function bind($src, $ignore = array());

当您将其与您提供的EasyBlogTableMediaManager课程中的声明进行比较时:

public function bind( $data = array() )
{
    return parent::bind( $data );
}

您可以看到方法签名不同(即EasyBlog bind()方法仅定义单个参数$data)。因此,引用之前链接的接口的PHP文档:

  

注意:实现接口的类必须使用完全相同   方法签名,如界面中定义的那样。不这样做会   导致致命错误。

在Joomla 2.5.x和Joomla 3.x之间,几个方法签名发生了变化,因为它是interface这是预期的,开发人员可以为每个版本生成单独的扩展版本以避免此问题但它确实引入了额外的支持层。

如果您需要Maximum

上的错误报告

您可以通过简单地将方法签名更改为:

来解决此问题
public function bind( $data = array(), $ignore = array())
{
    return parent::bind( $data );
}

但是,这可能会导致错误在类层次结构中进一步向上移动,如果更新EasyBlog的版本(因为您的更改将被覆盖),可能会重新出现。最好用major version number change来接受它。

答案 1 :(得分:0)

固定! 我使用了以下代码

    public function bind( $data = array(), $ignore = array())
{
    return parent::bind( $data );
}

其中standards violation error

为了解决这个问题,我需要通过向EasyBlogTableMediaManager类添加其他参数来对load function的声明进行以下更改 -

public function load($path = '' , $type = '' ,   $keys = null, $reset = true )