为啥在 php 7 中添加回调类型提示会触发弃用警告

Posted

技术标签:

【中文标题】为啥在 php 7 中添加回调类型提示会触发弃用警告【英文标题】:Why does adding callback typehint in php 7 trigger deprecation Warning为什么在 php 7 中添加回调类型提示会触发弃用警告 【发布时间】:2020-10-09 02:18:54 【问题描述】:

我有下面的代码。相当简单的东西。但是,它会发出警告:Deprecated: Non-static method Foo::bar() should not be called statically in test.php on line 13 如果我向 $method 参数添加类型提示(例如,可调用的 $method),则会收到 2 个警告。如果我删除类型提示,则不会发出警告。它实际上似乎也触发了 spl 自动加载过程(如果需要)。

有人知道为什么吗?这是一个错误,还是我做错了什么?

谢谢

<?php
class Foo


    public function bar()
    
        echo 'baz';
    


function justReturn($method): callable

    return $method;


justReturn([Foo::class, 'bar']);

【问题讨论】:

【参考方案1】:

bar不是静态方法,所以需要通过对象来调用,例如

$foo = new Foo;
$foo->bar();

如果您希望它在没有对象的情况下可调用,则需要将其声明为静态。

static public function bar() 
    echo "baz";

【讨论】:

感谢您的尝试,但您错过了重点。很明显,它不是静态的,也不应该是静态的。实际上,要使其可调用,它需要是静态的,或者第一部分应该是对象的实例。问题是,如果“justReturn”函数不存在 typehint,为什么它会起作用,如果设置了 typehint,它会发出警告?因为如您所见,我没有对方法 bar() 进行任何实际调用 刚刚意识到我回答了自己的问题。该方法并不是真正静态的,我假设添加类型提示将测试它是否存在/是否正确。感谢您指出我的答案

以上是关于为啥在 php 7 中添加回调类型提示会触发弃用警告的主要内容,如果未能解决你的问题,请参考以下文章

Drupal 7搜索API挂钩注册的回调类没有被触发

为啥 $handler 在回调中得到不同的值?

自定义元框 Save_Post 回调未在 functions.php 中触发

PHP 7.1 - 为啥没有关于 void 返回值的警告?

为啥 PHP 中需要类型提示?

layui 子弹出框操作成功后, 刷新父弹出框的内容