У меня проблема с easyblog
. Когда я пытаюсь открыть запись в блоге через бэкэнд, я получаю следующую ошибку:
Неустранимая ошибка: объявление EasyBlogTableMediaManager :: bind() должно быть совместимо с объявлением JTableInterface :: bind() в /home/mysit/public_html/localadvertiser/administrator/components/com_easyblog/tables/mediamanager.php в строке 46
Я запускаю 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 );
}
}
Да, я думаю, что ошибка возникает, потому что у вас установлен максимальный отчет об ошибках, который, вероятно, вызывает режим STRICT
, если вы установите уровень None
он должен работать нормально, поскольку это установит display_errors
в 0. Это также, вероятно, указание на то, что вы используете PHP 5.4 или выше на своем сервере (A Good Thing ).
Поскольку в Declaration of EasyBlogTableMediaManager::bind()
ошибки указано, что Declaration of EasyBlogTableMediaManager::bind()
должна быть совместимой (т.е. той же/совпадением) с исходным объявлением в классе JTableInterface
.
Это говорит нам о том, что EasyBlogTableMediaManager
который расширяет EasyBlogTable
имеет родительский класс, возвращающийся в JTable
(найденный в /libraries/joomla/table/table.php
), который определяется как:
abstract class JTable extends JObject implements JObservableInterface, JTableInterface
Вы заметите, что он реализует JTableInterface
, что означает, что исходный JTable->bind()
должен соответствовать объявлению интерфейса JTableInterface
(найденному в /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 изменилось несколько сигнатур методов, учитывая, что это изменение номера основной версии ожидается, и разработчики могут создавать отдельные сборки расширений для каждой версии, чтобы избежать этой проблемы, но она вводит дополнительный уровень поддержка.
Maximum
Вы можете исправить это, просто изменив подпись метода на это:
public function bind( $data = array(), $ignore = array())
{
return parent::bind( $data );
}
Однако это может привести к тому, что ошибка будет продвигаться дальше по иерархии классов и, вероятно, снова появится, если вы обновите версию EasyBlog (поскольку ваши изменения будут переписаны). Вероятно, лучше всего занять это с разработчиком EasyBlog.
Исправлена! Я использовал следующий код
public function bind( $data = array(), $ignore = array())
{
return parent::bind( $data );
}
Что дало ошибку нарушения стандартов
Чтобы исправить это, мне нужно было внести следующие изменения в объявление функции загрузки, добавив дополнительные параметры в класс EasyBlogTableMediaManager -
public function load($path = '' , $type = '' , $keys = null, $reset = true )