Почему я получаю это сообщение о строгих стандартах? - PullRequest
4 голосов
/ 03 ноября 2010

Я создал модель 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)

Ответы [ 4 ]

12 голосов
/ 03 ноября 2010

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

public function insert($data) {

должно быть:

public function insert(array $data) {

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

2 голосов
/ 03 ноября 2010

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

1 голос
/ 03 ноября 2010

Сама ошибка заключается в том, что 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 голосов
/ 03 ноября 2010

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

[edit]

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

[edit]

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

...