代码之家  ›  专栏  ›  技术社区  ›  karim79

为什么我会收到这个严格标准的信息?

  •  4
  • karim79  · 技术社区  · 14 年前

    我通过扩展 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
    

    E_STRICT 但我更想知道为什么我会收到上述通知。有什么想法吗?(PHP5.3,ZendFramework1.10)

    4 回复  |  直到 14 年前
        1
  •  12
  •   karim79    14 年前

    Mchl基本上是正确的,但您得到的错误是来自参数不完全匹配,即:

    public function insert($data) {
    

    应该是:

    public function insert(array $data) {
    

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

        2
  •  2
  •   teemitzitrone    14 年前

    public function insert(array $data) (注意$data前面的数组typehint)

        3
  •  1
  •   ircmaxell    14 年前

    错误本身是因为 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') {}
    

    它不一定是“坏”的(框架和开发人员总是这样做)。现在语言支持得很好。原因是 错误在于将来语言可能不支持它。所以它“警告你”使用这样的设计可能是个坏主意。。。

        4
  •  0
  •   Mchl    14 年前

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

    至少这是它通常的意思,因为查看Zend_Db_Table_Abstract::insert()文档,我看不到任何不同。。。

    [编辑]

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