为什么我收到此严格标准消息?

时间:2010-11-03 13:57:47

标签: php zend-framework zend-db-table

我通过扩展Zend_Db_Table_Absract创建了一个Zend Framework模型,如下所示(简化示例):

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 个答案:

答案 0 :(得分:12)

Mchl大多是正确的,但你得到的错误来自参数不完全匹配,即:

public function insert($data) {

应该是:

public function insert(array $data) {

请注意array之前的$data类型说明符,您看到的混合类型是返回类型,参数类型为array

答案 1 :(得分:2)

必须是public function insert(array $data) (注意$ data之前的数组typehint)

答案 2 :(得分:1)

错误本身是因为您在error_reportingerror_reporting ini directive设置了E_STRICT ...

基本上,它所说的是通过继承来改变函数的“签名”并不是一种好的做法。一个例子:

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错误的原因是将来该语言可能不支持它。所以它“警告你”使用你的设计可能是一个坏主意......

答案 3 :(得分:0)

因为你的Foos :: insert()方法有Zend_Db_Table_Abstract :: insert()的不同签名(参数列表,访问修饰符)。根据严格的规则,子类中覆盖父类中方法的方法需要具有相同的签名。

[编辑]

至少它通常意味着什么,因为查看Zend_Db_Table_Abstract :: insert()文档,我看不出任何不同......

[编辑]

如果$ data参数有类型提示,请检入Zend_Db_Table_Abstract :: insert()。有可能 public function insert(array $data) {...