我正在逐步将我的项目从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) 让 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(但我不确定这个问题是否特定于操作系统)。
兹洛茨
当我运行以下代码作为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) 正如标题所说,这个错误发生在我身上。我搜索互联网并发现 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 的 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 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 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) 我必须将基于 codeigniter 3 的 CRM 从 PHP 版本 7.4 迁移到版本 8.*。但当我探索 codeigniter 3 与 php 8 的兼容性时,我发现很少有答案说它不兼容。
但这个答案已经很旧了(大约 1 到 2 年)。两个参考是: Codeigniter 论坛 codeigniter github
所以,作为参考是旧的。Codeigniter 3 目前支持 php 版本 8 吗?
我一直在寻找一些关于 的最佳值的指南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也没有帮助。
我想答案是:在您的环境中进行一些基准测试并选择最佳的缓冲区大小。
有人对这个话题有一些想法吗?或者也许知道一个好的参考资料?