当前位置:首页 > php > 正文内容

php中Warning: Declaration of … should be compatible with …

phpmianshi2个月前 (04-14)php120

背景

今天sentry收到报警:Declaration of (类方法1) should be compatible with (类方法2); 详情如下:

Declaration of App\Services\MemcacheAgp::get($key) should be compatible with Memcached::get($key, $cache_cb = NULL, $get_flags = NULL)

字面上理解是:类方法1的声明应该符合类方法2,搜索引擎貌似给了个专业的说法:“方法重写,参数不同”。


分析

代码如下:

<?php

namespace App\Services;

class MemcacheAgp extends \Memcached
{
    private $agp_cache_pre = '';

    public function __construct($persistent_id = '', $on_new_object_cb = null)
    {
        global $CommonConfig;
        $this->agp_cache_pre = $cache_pre;
        parent::__construct($persistent_id, $on_new_object_cb);
    }

    public function set($key, $val, $time = 0, $udf_flags = 0)
    {
        global $CommonConfig;
        $key = $this->agp_cache_pre . $key;
        return parent::set($key, $val, $time);
    }

    public function get($key)
    {
        $key = $this->agp_cache_pre . $key;
        $return = parent::get($key);
        return $return;
    }

}


解决方案

结合搜索到的信息给出我的理解:

其实警告中已经给出了解决办法,由于代码中使用了 class ... extends ... 类继承,报错警告就是告诉你:重写方法的参数不对,你既然继承了这个基类方法,那么重写方法的参数也要按着原样来。

基类中get有三个参数,定义如下:

public function get ($key, callable $cache_cb = null, $flags = 0) {}

我的代码中只有1个参数,并且没有默认值,同时还少了一个2个参数

于是在新版的PHP中就报错,把我重写的方法参数照着基类改一下就解决问题了:

<?php

namespace App\Services;

class MemcacheAgp extends \Memcached
{
    private $agp_cache_pre = '';

    public function __construct($persistent_id = '', $on_new_object_cb = null)
    {
        global $CommonConfig;
        $this->agp_cache_pre = $cache_pre;
        parent::__construct($persistent_id, $on_new_object_cb);
    }

    public function set($key, $val, $time = 0, $udf_flags = 0)
    {
        global $CommonConfig;
        $key = $this->agp_cache_pre . $key;
        return parent::set($key, $val, $time);
    }

    public function get($key, $cache_cb = null, $flags = 0)
    {
        $key = $this->agp_cache_pre . $key;
        $return = parent::get($key);
        return $return;
    }

}


注意事项

基类中第二个参数是有定义类型的,但是我们重写的方法是不能定义类型的,否则会报错

public function get($key,  callable $cache_cb = null, $flags = 0)

我们只能定义成如下形式:

public function get($key, $cache_cb = null, $flags = 0)

其实如果子类重写方法的参数和基类不一样,只要给参数个默认值,使得编译器认为参数可以为空,保持重写方法与基类方法的函数签名相同就可以了。

版权声明:本文由PHP面试资料网发布,如需转载请注明出处。
分享给朋友:

相关文章

php中连接mysql的三种方式和预处理下的sql注入

php中连接mysql的三种方式和预处理下的sql注入

基础一条 SQL 在 DB 接收到最终执行完毕返回,大致的过程如下:  1. 词法和语义解析;  2. 优化 SQL 语句,制定执行计划;  3. 执行并返回结果;即时 SQL$sql =&...

Windows下nginx+fastcgi+php的并发阻塞问题

同事接到一个需求,需要调用同一个项目的另一个接口,于是CURL调用接口。代码撸完了,本地测试一下 浏览器一直转圈圈直到超时…… 百思不得其解主要是windows+nginx开发环境遇到的问题,本人很少...

PHP程序员解决问题能力的六个级别

青铜  var_dump/die打印变量值信息单步调试是最简单粗暴有效的解决问题方法。高级一点的是使用打印日志。白银 会设置各种错误日志的记录和显示,并根据各种错误日志分析错误或者搜索别人的...

PHP内核分析之生命周期五个阶段(四)

一、模块初始化阶段我们先来看一下该阶段的每个函数的作用。1.1、sapi_initialize_request_empty函数// main/SAPI.c SAPI_API vo...

PHP内核分析之常见变量基本结构(六)

一、类型一览zval中的u1.v.type用来存储变量的类型,而zval.value存储的是不同类型对应的值,所以type决定value取值的地方,以下是PHP7所定义的所有类型。#define&nb...

PHP中const和static的区别和联系

1.const是类中的常量,类外用define定义常量2.const只可以修饰类的属性,不能修饰类的方法,static可以修饰属性,也可以修饰方法3.const和static都属于类本身,而不属于ne...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。