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

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

phpmianshi5个月前 (04-14)php250

背景

今天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中self与static区别和联系

PHP官方也说过,大概意思是说self调用的就是本身代码片段这个类,static - PHP 5.3加进来的只得是当前这个类,有点像$this的意思,static调用的是从堆内存中提取出来,访问的是当...

phpstorm2020.3.1最新永久破解方法

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

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

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

PHP红包分配算法

<?php /**  * User: phpmianshi.com   * Date: 2020/3/31 &nbs...

DAL、DAO、ORM、Active Record详解

模型 Model模型是MVC中的概念,指的是读取数据和改变数据的操作(业务逻辑)。一开始我们直接把和数据库相关的代码放在模型里(sql直接写在代码中),这样就会导致以后的维护相当麻烦。业务逻辑的修改都...

php中opcache注意事项以及调优

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

发表评论

访客

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