我通过扩展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)
答案 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_reporting
或error_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) {...