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

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

phpmianshi2个月前 (04-14)php129

背景

今天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中opcache注意事项以及调优

背景从 PHP5.5 开始,Opcache 扩展是核心的一部分,增加了对 PHP 脚本的字节码缓存的支持。对于动态语言(例如 PHP ),字节码缓存可以显著的提高性能,因为它可以确保脚本仅被编译一次。...

PHP7的垃圾回收机制

PHP7的垃圾回收机制

垃圾回收机制垃圾回收机制是一种动态存储分配方案。它会自动释放程序不再需要的已分配的内存块。 自动回收内存的过程叫垃圾收集。垃圾回收机制可以让程序员不必过分关心程序内存分配,从而将更多的精力投入到业务逻...

phpstorm2020.3.1最新永久破解方法

phpstorm又更新了,截至目前为止,官网的最新版本为phpstorm2020.3.1,这次phpstorm的更新UI界面就有了很大的变化,主要是添加了对PHP8的支持,具体的可以去官网去了解哈。同...

lumen项目集成laravelS后sentry无法上报的问题

背景公司项目严重依赖lumen系列,代码众多,重构困难,虽然访问量变大,性能问题越来越严重,急需要提升性能,于是找到了这个项目laravelS github : https://github.com/...

PHP内核分析之GDB使用(一)

1.PHP源码下载和安装https://github.com/php/php-src/releases$ ./configure --prefix=/usr/local/php7&...

PHP数组实际占用内存大小的分析

1.数组正常的赋值是不会发生内存改变的,但是当赋值的新数组发生改动的时候,php就会新开辟内存给新的数组,这里会造成无谓的内存消耗。最好是不要直接这样赋值,如果非赋值不可的话,记得加上‘&’符...

发表评论

访客

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