2010-11-03 3 views
4

Я создал модель Zend Framework путем расширения Zend_Db_Table_Absract следующим образом (упрощенный пример):Почему я получаю это сообщение о строгих стандартах?

class Foos extends Zend_Db_Table_Abstract 
{ 
    protected $_schema = 'Foo'; 
    protected $_name = 'Foos'; 
    protected $_primary = 'id'; 
    protected $_sequence = true; 

    public function insert($data) { 
     $db = $this->getAdapter(); 
     $record = array('field1' => $data['field1'], 
         'field2' => $data['field2'], 
         ... 
       ); 
     return parent::insert($record); 
    } 
} 

выше правильно вставляет запись. Проблема заключается в том, я получаю следующее уведомление:

Strict Standards: Declaration of Foos::insert() should be compatible with that of Zend_Db_Table_Abstract::insert() in /x/x/x/Foo.php on line XX 

Насколько я могу сказать от прочитав документацию и API несколько раз, как я делаю это правильно. Я знаю, что могу отключить E_STRICT, но я бы скорее знал, почему я получаю вышеуказанное уведомление. Есть идеи? (PHP 5.3, Zend Framework 1.10)

+0

Только что зарегистрированный источник: это 'public function insert (array $ data)' – Mchl

+1

Спасибо всем за ваши ответы. – karim79

ответ

12

MCHL в основном верно, но ошибка, вы получаете от параметра не соответствует точно, а именно:

public function insert($data) { 

должно быть:

public function insert(array $data) { 

Примечание array типа спецификатор до $data, смешанный вид, который вы видите, является типом возврата, тип аргумента - array.

+0

Пятно на, это решило. Спасибо, Гадюка! – karim79

+1

Точно. См. Строку 1022 [исходного кода] (http://framework.zend.com/svn/framework/standard/branches/release-1.9/library/Zend/Db/Table/Abstract.php). – lonesomeday

0

Поскольку у вас метод Foos :: insert() имеет другую подпись (список аргументов, модификатор доступа) из Zend_Db_Table_Abstract :: insert(). Согласно строгим правилам, методы в классе child, которые переопределяют методы в родительском классе, должны иметь одну и ту же подпись.

[править]

По крайней мере, это то, что это обычно означает, потому что, глядя на Zend_Db_Table_Abstract :: вставить() документацию, я не могу видеть ничего другого ...

[править]

Зайдите в Zend_Db_Table_Abstract :: insert(), если есть подсказка типа для аргумента $ data. Это может быть public function insert(array $data) {...

+0

Спасибо за ответ. Я не вижу разницы между двумя сигнатурами, API-документы говорят «смешанная вставка ($ data)», которая точно соответствует сигнатуре в моем классе класса - '$ data', которая является ассоциативным массивом (пары ключ/значение) в качестве пример демонстрирует. – karim79

2

он должен быть public function insert(array $data) (обратите внимание на typehint массива до $ данных)

1

Ошибки сам по себе, потому что у вас есть E_STRICT набора в error_reporting или error_reporting ini directive ...

В общем, что это высказывании что нецелесообразно менять «подпись» функции через наследование. Пример:

class ParentClass { 
    public function doFoo() {} 
} 

class ChildClass extends ParentClass { 
    public function doFoo($bar) {} 
} 

Это вызвало бы эту ошибку, поскольку родительская и дочерняя сигнатуры не совпадают. Теперь подпись выглядит так, как выглядит синтаксический анализатор, поэтому:

public function doFoo($bar) {} 
public function doFoo($baz) {} 

Подходящие подписи. Имена переменных не обязательно должны быть одинаковыми, но количество переменных, их порядок, подсказки их типов и их значения по умолчанию должны быть одинаковыми.

public function doFoo(array $bar, ParentClass $somethign, $biz = 'no') {} 
public function doFoo(array $baz, ParentClass $parent, $buz = 'no') {} 

Они совпадают, как хорошо, но это не:

public function doFoo(array $baz, ParentClass $parent, $buz = 'no') {} 
public function doFoo(array $baz, ChildClass $parent, $buz = 'no') {} 

Это не обязательно «плохо», чтобы сделать (рамки и разработчики делают это все время). В настоящее время язык поддерживает это хорошо. Причиной ошибки E_STRICT является то, что в будущем язык может ее не поддерживать. Поэтому он «предупреждает вас», что может быть плохой идеей использовать ваш дизайн так ...

+0

Спасибо за объяснение ircmaxell :) – karim79

Смежные вопросы