全局覆盖 Laravel 中的基本计数函数

overwriting basic count function in laravel globally

提问人:yuvi 提问时间:10/8/2023 更新时间:10/9/2023 访问量:42

问:

我们正在升级我们的 laravel 项目,它包括从 php7 到 php8 的语言升级。请考虑以下代码:

$a = new stdClass()
count($a)

将导致:

// php7
==> 1

// php8
==> TypeError  count(): Argument #1 ($value) must be of type Countable|array

现在我们的应用程序非常大,有很多小的零碎的东西,而且计数在很多地方都用在了可能不应该使用的东西上。我覆盖了大部分地面,但理想情况下,我希望有某种后备措施。有没有办法全局覆盖 laravel 应用程序中的内置计数函数,希望能做这样的事情:

// very general pseudocode
function newCount($foo) { 
    try {
        return count($foo); 
    } except {
        \Log::warning('used count on non Countable|array')
        return 1;
    }
}

然后以某种方式绑定它:

// anywhere in the app code
count($a) // ==> will call newCount($a) instead
拉维尔 PHP-7 PHP-8

评论

2赞 lagbox 10/8/2023
不。。。但是,您没有理由不能在自己的代码库中进行搜索和替换,以将调用替换为其他内容
0赞 xenooooo 10/9/2023
为什么不直接更新呢?然后,当它触发异常时,它需要返回 1 ?count()TypeError
0赞 Nico Haase 10/9/2023
出于好奇:你当初为什么要写这么奇怪的代码?为什么不把代码改成它应该设计的东西,而不是随机的呢?调用一个没有实现 Countable 的对象对我来说看起来很奇怪count
0赞 yuvi 10/9/2023
@NicoHaase我没有。该代码库是由几位开发人员在近十年的时间里编写的。有些写得很好,有些部分很奇怪。我是那个试图升级它的人。它就是这样。
0赞 yuvi 10/9/2023
@lagbox我已经这样做了,但就是这样,代码库足够大,我可能会遗漏某些部分。这就是为什么我仍然想以某种方式“配置”一个通用的回退,这样我可能错过的系统的某些利基部分就不会出错和无法工作。这有意义吗?

答:

1赞 hassan 10/9/2023 #1

你有多种方法可以实现这一点,使用一些第三方扩展,一种方法是使用 uopz,它允许你挂钩到预定义的函数并编辑它的行为。

另一种方法是使用一些静态代码分析器 - 类似于PHPStan - 或任何其他替代方案,轻松扫描和更新代码。