是否有类型提示允许PHP 8.3
使用ExampleClass[]
它来声明它是该类的对象数组ExampleClass
?
在我的具体情况下,ExampleClass
称为Task
我想要但不起作用:
private Task[] $tasks;
Run Code Online (Sandbox Code Playgroud)
我的 PHPStorm IDE 告诉我,只有在 doc 类型中才允许使用复数类型
——也就是说,只有在PHPDoc
using中Tasks[]
才完全可以。但我想使用纯 PHP。
错误是:
PHP Parse error: syntax error, unexpected token "[", expecting variable
如果我只需要一个对象Task
而不是一组对象,Task[]
那么它可以使用:
private Task $task;
Run Code Online (Sandbox Code Playgroud)
这是我当前的工作解决方法:
private array $tasks;
Run Code Online (Sandbox Code Playgroud) 我正在使用当前不支持 PHP 8.2 的第 3 方作曲家库,并尝试为我的应用程序添加兼容性。
3rd 方包具有以下类:
class Configuration { }
class ApiClient extends Configuration { }
Run Code Online (Sandbox Code Playgroud)
然后我有另一个扩展:
class MyApiClient extends ApiClient { }
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
[E_DEPRECATED] Creation of dynamic property MyApiClient::$propertyName is deprecated
修复应该是添加#[AllowDynamicProperties]
,但这实际上并没有做任何事情。
我有以下内容:
#[AllowDynamicProperties]
class MyApiClient extends ApiClient { }
Run Code Online (Sandbox Code Playgroud)
并且仍然收到弃用错误。
我什至编辑了底层库文件,最终得到以下内容:
#[AllowDynamicProperties]
class Configuration { }
#[AllowDynamicProperties]
class ApiClient extends Configuration { }
#[AllowDynamicProperties]
class MyApiClient extends ApiClient { }
Run Code Online (Sandbox Code Playgroud)
但弃用错误仍然存在。
我有点不知所措,因为我看不出这些属性没有理由不生效。我缺少什么?我肯定正在编辑正确的文件,并且如果我在弃用错误中定义了属性,MyApiClient
则会消失。
编辑:
作为一个似乎需要的更清晰的例子:
class Configuration
{
public function __construct() …
Run Code Online (Sandbox Code Playgroud) 我无法在 Ubuntu 18 中安装 php8.2-fpm,这是我的安装命令:
sudo apt install lsb-release apt-transport-https ca-certificates software-properties-common -y
sudo add-apt-repository ppa:ondrej/php
sudo apt update
sudo apt install php8.2
Run Code Online (Sandbox Code Playgroud)
这是响应,包括错误:
$ sudo apt-get install php8.2 php8.2-fpm
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package php8.2
E: Couldn't find any package by glob 'php8.2'
E: Couldn't find any package by regex 'php8.2'
E: Unable to locate package php8.2-fpm
E: Couldn't find any package by glob 'php8.2-fpm'
E: Couldn't find …
Run Code Online (Sandbox Code Playgroud) 我想测试(使用 PHPUnit)一个包含 foreach 循环的方法。我想要完整的路径覆盖。原始代码有点太复杂,所以我在下面创建了一个最小的示例来说明我的问题。foreach
PHP中的循环有3种情况。(我使用 PHP 8.2。)
public function dodo(array $a)\n {\n foreach ($a as $one) {\n return $one;\n }\n\n return null;\n }\n
Run Code Online (Sandbox Code Playgroud)\n很容易涵盖前两个:非空数组和空数组。但是我如何传递一个不可迭代的东西作为函数参数呢?我尝试了几种方法,但我\xe2\x80\x99已经得到了类型错误。
\n$something->dodo(null); # TypeError\n\ncall_user_func([$something, 'dodo'], null); # TypeError\n\n$rClass = new ReflectionClass($something);\n$rMethod = $rClass->getMethod('dodo');\n$rMethod->invoke($something, null); # TypeError\n
Run Code Online (Sandbox Code Playgroud)\n我不想\xe2\x80\x99 不想从方法定义中删除或更改类型。这会使代码的可读性降低一些。有办法解决吗?如何编写一个涵盖 foreach 循环的所有情况的测试?
\n换句话说:\n我如何使用dodo
错误类型的参数调用?我想编写具有非常高的代码路径覆盖率的测试。
我\xe2\x80\x99m 在 PHP 8.2\xe2\x80\x99s 动态属性弃用方面遇到了困难。I\xe2\x80\x99m 在这里寻找与 PHP 9.0 兼容的永久解决方案,因此添加属性#[AllowDynamicProperties]
是对我来说不是一个解决方案。
这里\xe2\x80\x99是我的问题。例如,我曾经有以下课程:
\nclass planet {\n function __construct($id, $a, $m, $i, $e, $\xcf\x80) {\n $this->a = $a;\n $this->e = $e;\n $this->i = $i;\n $this->id = $id;\n $this->m = $m;\n $this->n = .9856076686 / ($a * sqrt($a));\n $this->\xcf\x80 = $\xcf\x80;\n }\n}\n
Run Code Online (Sandbox Code Playgroud)\n然后我将使用以下数组创建每个行星:
\n$pl = [\n new planet("Mercury", .38709831, 3.3011e23, 7.004986, .20563, 77.456119),\n new planet("Venus", .723332982, 4.8675e24, 3.394662, .006772, 131.563703)\n];\n
Run Code Online (Sandbox Code Playgroud)\n等等。
\n如果我现在尝试这个,我当然会收到现在著名的通知:\nDeprecated: Creation of …