标签: php-8

迁移到 PHP 8.0:使用 $this 时解除绑定 $this

我正在逐步将我的项目从PHP 7.1迁移到PHP 8.0

在PHP官方手册中,在“从PHP 7.3.x迁移到PHP 7.4.x”一章的“弃用功能”子章节中,我尝试理解以下弃用描述

解除绑定$this$this使用

解除绑定$this使用的非静态闭包$this解除绑定。

虽然,没有成功。

这就是为什么如果有人能详细解释我这意味着什么,我将不胜感激。也许代码片段也有帮助。

非常感谢您的宝贵时间!


也许这也有助于解释

在我的项目中,我认为只有一种情况可以应用此弃用通知:下面介绍的类executeGroupHandler的方法RouteCollection。我更愿意粘贴更多的类代码,以帮助您理解我使用该方法的上下文executeGroupHandler

路由集合类:

<?php

namespace Packages\Router;

//...
use Packages\Router\RouteCollectionInterface;


/**
 * Route collection.
 */
class RouteCollection implements RouteCollectionInterface {

    //...

    /**
     * Group patterns list. Indexed array.
     *
     * Each time a group handler is executed its pattern is saved in this list.
     * …
Run Code Online (Sandbox Code Playgroud)

php php-7 php-7.4 php-8

7
推荐指数
1
解决办法
2648
查看次数

让 PHP7 和 PHP 8 共存

让 PHP7 和 PHP 8 共存

我已经从 PHP 7 升级到 PHP 8。正如 PHP 的通常情况一样,我仍然有 php7.4 /usr/bin(以及 php8.0)。但是,当我运行该php -v命令时,它回答 php8.0。

从那时起,当尝试安装软件(例如 Docker 和 VirtualBox)时,我收到错误消息php7.4-fpm.service: Failed with result 'exit-code',后跟Failed to start The PHP 7.4 FastCGI Process Manager. 因此,我似乎需要 php7.4 来运行才能安装此类应用程序。

但我使用 PHP 8 功能来编写网站,因此不想回到 php7.4

有没有办法同时使用php8.0和php7.4?我可以让 PHP 8 在虚拟机上运行,​​但它相当繁重。

我使用的是 Ubuntu 20(但我不确定这个问题是否特定于操作系统)。

兹洛茨

php fpm php-7.4 php-8

7
推荐指数
2
解决办法
2万
查看次数

在火柴臂中使用闭包

当我运行以下代码作为condition_2匹配结果时,其内容$foo是一个闭包实例,但我想要该闭包应返回的结果。你怎么做到这一点?condition_1正在按预期工作。

$foo = match ($conditions) {
    'condition_1' => 'some text',
    'condition_2' => function () {
        $result = '';
        // crazy programming
        return $result;
    }
}
Run Code Online (Sandbox Code Playgroud)

php match php-8

7
推荐指数
1
解决办法
2830
查看次数

什么是 PHP8 JIT 编译器

什么是 PHP8 JIT?以及它能给 PHP 世界带来哪些优势?我的理解是,它用于性能改进。

php php-8

6
推荐指数
1
解决办法
752
查看次数

函数 exception_error_handler() 的参数太少 - PHP8

正如标题所说,这个错误发生在我身上。我搜索互联网并发现 https://github.com/processwire/processwire-issues/issues/1286#issuecomment-738880424

原始代码:

function exception_error_handler($errno, $errstr, $errfile, $errline, $errcontext) {
}
Run Code Online (Sandbox Code Playgroud)

我只是更改最后一个参数并将其设为可选,如下所示:

function exception_error_handler($errno, $errstr, $errfile, $errline, $errcontext=[]) {
}
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么这个参数变成可选的?

php php-8

6
推荐指数
1
解决办法
2815
查看次数

无法将命名参数传递给具有可变参数的内部函数

我玩了一下 php 的 array_map 函数,并考虑将它与命名参数一起使用,因为参数顺序总是让我恼火。(这些函数没有做任何有用的事情。只是需要一些东西来测试。)

到目前为止一切顺利,这是按预期工作的:

$testArray = [
    'a' => [],
    'b' => [1, 2, 3],
];
$result = array_map(array: $testArray, callback: fn (array $arr) => count($arr) === 0 ? null : $arr);
Run Code Online (Sandbox Code Playgroud)

(即使我需要一段时间来弄清楚数组参数的名称,正如array1德国文档中所记录的那样。但这是一件事情,我一有时间就会研究它。)

但是后来我尝试使用更多参数调用该函数。

所以,我的第一次尝试:

array_map(array: $testArray, callback: fn (array $arr) => count($arr) === 0 ? null : $arr, []);
Run Code Online (Sandbox Code Playgroud)

致命错误:不能在命名参数后使用位置参数

我了解到我不能在命名参数之后传递位置参数。

然后反过来:

array_map([], array: $testArray, callback: fn (array $arr) => count($arr) === 0 ? null : $arr);
Run Code Online (Sandbox Code Playgroud)

致命错误:未捕获错误:命名参数 $callback 覆盖了之前的参数

好的。它将第一个参数作为第一个位置参数并且很困惑,因为我覆盖了它。

我开始谷歌搜索。好的,未知的命名参数被传递给可变参数。让我们试试看:

array_map(array: $testArray, callback: …
Run Code Online (Sandbox Code Playgroud)

php array-map php-8

6
推荐指数
0
解决办法
457
查看次数

参数 #1 ($parser) 必须通过引用传递

从 PHP 7.4 迁移到 PHP 8.0,我遇到了一些代码抛出警告的问题。代码有效,但我想找出问题所在。PHP 7.4 中没有警告。以下是警告:(已修改以将我的信息从错误中删除)

PHP 警告:XML::open():参数 #1 ($parser) 必须通过引用传递,值在 .../classes/xml_5.php 第 89 行给出

PHP 警告:XML::open():参数 #1 ($parser) 必须通过引用传递,值在 .../classes/xml_5.php 第 89 行给出

PHP 警告:XML::open():参数 #1 ($parser) 必须通过引用传递,值在 .../classes/xml_5.php 第 89 行给出

PHP 警告:XML::data():参数 #1 ($parser) 必须通过引用传递,值在 .../classes/xml_5.php 第 89 行给出

PHP 警告:XML::close():参数 #1 ($parser) 必须通过引用传递,值在 .../classes/xml_5.php 第 89 行给出

PHP 警告:XML::open():参数 #1 ($parser) 必须通过引用传递,值在 .../classes/xml_5.php 第 89 行给出

(他们继续做同样的事情)

代码:

    function __construct(){
        $this->parser = xml_parser_create();
        xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, false);
        xml_set_object($this->parser, $this);
        xml_set_element_handler($this->parser, 'open', 'close');
        xml_set_character_data_handler($this->parser, 'data');
    } …
Run Code Online (Sandbox Code Playgroud)

php xml warnings php-8

6
推荐指数
1
解决办法
1万
查看次数

由于“未知的命名参数”,phpunit 测试在进入 php 8.0 后失败

一旦我们需要的一些第三方库准​​备就绪,我们就准备迁移到 php 8.0.15。

我们用于单元测试的集中式 setUp() 函数处理我们的类模拟的 constructorArg 填充。

当前使用 phpunit v9.5.14,我们得到失败的测试,响应错误:未知的命名参数 $User

据我们所知,我们没有在代码库中使用命名参数。

if (empty($this->constructorArgs)) {
    $this->constructorArgs = array('User');
}
if (!empty($this->constructorArgs) && is_array($this->constructorArgs)) {
    foreach ($this->constructorArgs as $classname) {
        if (is_array($classname)) {
            $args[key($classname)] = current($classname);
            $classname = key($classname);
        } else {
            if ($classname == "Twig" || $classname == "Twig\Environment") {
                $args[$classname] = TwigFactory::mockTwig();
            } else {
                $args[$classname] = $this->getMockBuilder($classname)->disableOriginalConstructor()->getMock();
            }
        }
        $container->set($classname, $args[$classname]);
    }
}

$this->mock = $this->getMockBuilder($this->class)
    ->setMethods($this->methods)
    ->setConstructorArgs($args)
    ->getMock();   <-- Error states this line, unfortunately no …
Run Code Online (Sandbox Code Playgroud)

php php-8

6
推荐指数
1
解决办法
1798
查看次数

Codeigniter 3 与 php 版本 8 兼容吗?

我必须将基于 codeigniter 3 的 CRM 从 PHP 版本 7.4 迁移到版本 8.*。但当我探索 codeigniter 3 与 php 8 的兼容性时,我发现很少有答案说它不兼容。

但这个答案已经很旧了(大约 1 到 2 年)。两个参考是: Codeigniter 论坛 codeigniter github

所以,作为参考是旧的。Codeigniter 3 目前支持 php 版本 8 吗?

codeigniter codeigniter-3 php-8

6
推荐指数
1
解决办法
2万
查看次数

在 PHP8 和 JIT 中选择最佳的 `opcache.jit_buffer_size` 值

我一直在寻找一些关于 的最佳值的指南opcache.jit_buffer_size。建议的值最多为 256M(例如https://php.watch/versions/8.0/JIT#jit-opcache.jit_buffer_size)甚至 500M(https://medium.com/@edouard.courty/make-your- php-8-apps-twice-as-fast-opcache-jit-8d3542276595)。但(在我看来)他们似乎只是任意选择的。

但是,我找不到关于如何选择该值的太多解释。“深入 JIT”一文 ( https://php.watch/articles/jit-in-depth#jit-ideal ) 提供了一些线索。

RFC https://wiki.php.net/rfc/jit也没有帮助。

我想答案是:在您的环境中进行一些基准测试并选择最佳的缓冲区大小。

有人对这个话题有一些想法吗?或者也许知道一个好的参考资料?

php optimization jit opcache php-8

6
推荐指数
0
解决办法
2104
查看次数

标签 统计

php-8 ×10

php ×9

php-7.4 ×2

array-map ×1

codeigniter ×1

codeigniter-3 ×1

fpm ×1

jit ×1

match ×1

opcache ×1

optimization ×1

php-7 ×1

warnings ×1

xml ×1