Fatal error: Declaration of EasyBlogTableMediaManager::bind() must be compatible with that of JTableInterface::bind()
Fatal error: Declaration of EasyBlogTableMediaManager::bind() must be compatible with that of JTableInterface::bind()
我对 easyblog
有疑问。当我尝试通过后端打开博客条目时,出现以下错误:
Fatal error: Declaration of EasyBlogTableMediaManager::bind() must be compatible with that of JTableInterface::bind() in /home/mysit/public_html/localadvertiser/administrator/components/com_easyblog/tables/mediamanager.php on line 46
我是运行Joomla 3.2.5
错误报告设置为 'maximum'。知道这里可能有什么问题吗?
这是发生错误的文件
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 );
}
}
TLDR
是的,我认为发生错误是因为您将错误报告设置为最大值,这可能会强制使用 STRICT
模式,如果您将级别设置为 None
它应该可以正常工作,因为这会将 display_errors
设置为 0。这也可能表明您在服务器上使用 PHP 5.4 或更高版本 (A Good Thing™)。
更长更精确:
由于错误指出 Declaration of EasyBlogTableMediaManager::bind()
必须 与 JTableInterface
[=] 中的原始声明兼容(即 same/match) 75=].
这告诉我们扩展 EasyBlogTable
的 EasyBlogTableMediaManager
有一个父 class 返回到 JTable
(在 /libraries/joomla/table/table.php
找到)定义如:
abstract class JTable extends JObject implements JObservableInterface, JTableInterface
你会注意到它实现了 JTableInterface
,这意味着原始 JTable->bind()
必须匹配 JTableInterface
的 interface 声明(位于 /libraries/joomla/table/interface.php
) 你会看到它在接口文件中定义为:
public function bind($src, $ignore = array());
当您将其与 EasyBlogTableMediaManager
class 中的声明进行比较时,您提供了:
public function bind( $data = array() )
{
return parent::bind( $data );
}
您可以看到方法签名不同(即 EasyBlog bind()
方法仅定义一个参数 $data
)。因此,引用之前链接的 interface 的 PHP 文档:
Note: The class implementing the interface must use the exact same
method signatures as are defined in the interface. Not doing so will
result in a fatal error.
在 Joomla 2.5.x 和 Joomla 3.x 之间,几个方法签名发生了变化,因为它是 major version number change 这是意料之中的,开发人员可以为每个版本生成单独的扩展构建来避免这个问题,但它确实引入了额外的支持层。
如果您需要 Maximum
的错误报告
您可以通过简单地将方法签名更改为以下内容来修复它:
public function bind( $data = array(), $ignore = array())
{
return parent::bind( $data );
}
然而,这可能会导致错误进一步向上移动 class 层次结构,并且如果您更新 EasyBlog 的版本可能会重新出现(因为您的更改将被覆盖)。最好用 developer of EasyBlog.
来处理它
已修复!
我使用了以下代码
public function bind( $data = array(), $ignore = array())
{
return parent::bind( $data );
}
其中给了一个standards violation error
为了解决这个问题,我需要通过向 EasyBlogTableMediaManager 添加额外的参数来对加载函数的声明进行以下更改 class -
public function load($path = '' , $type = '' , $keys = null, $reset = true )
我对 easyblog
有疑问。当我尝试通过后端打开博客条目时,出现以下错误:
Fatal error: Declaration of EasyBlogTableMediaManager::bind() must be compatible with that of JTableInterface::bind() in /home/mysit/public_html/localadvertiser/administrator/components/com_easyblog/tables/mediamanager.php on line 46
我是运行Joomla 3.2.5
错误报告设置为 'maximum'。知道这里可能有什么问题吗?
这是发生错误的文件
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 );
}
}
TLDR
是的,我认为发生错误是因为您将错误报告设置为最大值,这可能会强制使用 STRICT
模式,如果您将级别设置为 None
它应该可以正常工作,因为这会将 display_errors
设置为 0。这也可能表明您在服务器上使用 PHP 5.4 或更高版本 (A Good Thing™)。
更长更精确:
由于错误指出 Declaration of EasyBlogTableMediaManager::bind()
必须 与 JTableInterface
[=] 中的原始声明兼容(即 same/match) 75=].
这告诉我们扩展 EasyBlogTable
的 EasyBlogTableMediaManager
有一个父 class 返回到 JTable
(在 /libraries/joomla/table/table.php
找到)定义如:
abstract class JTable extends JObject implements JObservableInterface, JTableInterface
你会注意到它实现了 JTableInterface
,这意味着原始 JTable->bind()
必须匹配 JTableInterface
的 interface 声明(位于 /libraries/joomla/table/interface.php
) 你会看到它在接口文件中定义为:
public function bind($src, $ignore = array());
当您将其与 EasyBlogTableMediaManager
class 中的声明进行比较时,您提供了:
public function bind( $data = array() )
{
return parent::bind( $data );
}
您可以看到方法签名不同(即 EasyBlog bind()
方法仅定义一个参数 $data
)。因此,引用之前链接的 interface 的 PHP 文档:
Note: The class implementing the interface must use the exact same method signatures as are defined in the interface. Not doing so will result in a fatal error.
在 Joomla 2.5.x 和 Joomla 3.x 之间,几个方法签名发生了变化,因为它是 major version number change 这是意料之中的,开发人员可以为每个版本生成单独的扩展构建来避免这个问题,但它确实引入了额外的支持层。
如果您需要 Maximum
的错误报告
您可以通过简单地将方法签名更改为以下内容来修复它:
public function bind( $data = array(), $ignore = array())
{
return parent::bind( $data );
}
然而,这可能会导致错误进一步向上移动 class 层次结构,并且如果您更新 EasyBlog 的版本可能会重新出现(因为您的更改将被覆盖)。最好用 developer of EasyBlog.
来处理它已修复! 我使用了以下代码
public function bind( $data = array(), $ignore = array())
{
return parent::bind( $data );
}
其中给了一个standards violation error
为了解决这个问题,我需要通过向 EasyBlogTableMediaManager 添加额外的参数来对加载函数的声明进行以下更改 class -
public function load($path = '' , $type = '' , $keys = null, $reset = true )