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

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

phpmianshi5个月前 (04-14)php241

背景

今天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面试资料网发布,如需转载请注明出处。
分享给朋友:

相关文章

lumen中出现Syntax error or access violation: 1055 ‘***‘ isn‘t in GROUP BY

背景laravel 5.3 以后默认开启 mysql严格模式(strict)在mysql在严格模式下, 并且开启了ONLY_FULL_GROUP_BY的情况下,group by 的字段没有出现在 se...

Fiddler抓包设置及常见问题

Fiddler抓包设置及常见问题

Fiddler简介官网:https://www.telerik.com/fiddlerFiddler是比较好用的web代理调试工具之一,它能记录并检查所有客户端与服务端的HTTP/HTTPS请求,能够...

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

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

php中opcache注意事项以及调优

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

PHP对象使用数组形式访问成员变量

PHP中有很多接口类,不过平时都不会怎么用到.一般访问php类的变量都是使用类->变量名进行访问.除了这样还可以实现接口类用数组方式进行访问类["变量名"]需要实现的是Arr...

PHP中跨域原理以及解决方案

1.为啥出现跨域在制定Html规则时,为了安全的考虑,一个源的脚本(网页,网站)不能与另一个源的资源进行交互,所以就引发一个词叫做“同源策略”。所谓同源(即指在同一个域),就是两个页面具有相同的协议(...

发表评论

访客

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