问题标签 [php-8.1]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
php - 当重载一个父方法时,为什么 PHP8.1 转向弃用不兼容的返回类型?
我像这样重载query
了类的方法mysqli
:
在 PHP8.0 中这不是问题。但是,从 PHP8.1 开始,我现在收到此错误:
已弃用:返回类型 of
Repository\MySql\MySql::query($sql, $resultmode = null)
应与 兼容mysqli::query(string $query, int $result_mode = MYSQLI_STORE_RESULT): mysqli_result|bool
,或者#[\ReturnTypeWillChange]
应使用该属性暂时抑制第repository\src\MySql\MySql.php
30 行中的通知
我知道如何修复错误——我可能最终会更改方法的名称,因为我想返回一个我自己的自定义对象。
问题
我正在寻找一个从理论和面向对象的角度捕捉这种变化需求的答案,可能使用语言理论,或者将其与其他语言进行比较。
为什么这个改变是必要的?进行此更改的需要或原因是什么?扩展类时,有什么方法可以在 PHP 中允许重载返回类型?
php - php 8.1 - 旧脚本中不推荐使用的返回类型
尝试更新到 php 8.1 并注意到这个已弃用的通知出现在我想要处理的错误日志中。
[14-Feb-2022 14:48:25 UTC] PHP Deprecated: Return type of TLDExtractResult::offsetExists($offset) should either be compatible with ArrayAccess::offsetExists(mixed $offset): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/example/public_html/assets/tldextract/tldextract.php on line 299
我能够抑制警告,但实际上想更新脚本,以便将来没有问题。
这是有问题的代码部分:
php 8.1 到底不喜欢这里什么?这比我通常用 php 做的稍微高一点,并且不能完全确定这个问题。听起来像是需要指定特定的返回类型?
php - 参考:...的返回类型应该与...兼容,或者应该使用#[\ReturnTypeWillChange] 属性
在 PHP 8.1 中,以下代码在以前的版本中有效:
发出弃用通知:
不推荐使用:Example::count() 的返回类型应该与 Countable::count(): int 兼容,或者应该使用 #[\ReturnTypeWillChange] 属性来暂时抑制通知
这是什么意思,我应该如何解决?
enums - 在 Laravel 唯一验证 where 子句中检查支持的枚举的标量值
在 Laravel 9 和 PHP 8.1 中,我无法比较 laravel 验证规则中支持的枚举,您可以在其中使用 ->where 子句。它需要一个标量值来比较。有没有其他方法可以与枚举对象而不是标量值进行比较?
JProjectStatus 是一个支持的枚举
当我试图检查经理在项目是否处于活动状态时是唯一的时,我遇到了一个类型错误,我完全理解它正在将string与enum object进行比较。
消息“str_replace():参数 #3 ($subject) 必须是数组|字符串类型,App\Enums\JProjectStatus 给定”异常“TypeError”
但是,如果我像下面这样写,这是一个与 str_replate() 完全匹配的缩放器值。
因为现在'JProjectStatus::Active->value'是'active'的标量值
当然,我可以在 where 条件下通过闭包,但想知道最佳实践。我的问题是,这样写可以吗,或者有没有其他方法可以用枚举对象编写最佳实践。
php - Lumen v9 缺少 php artisan schedule 命令
在 lumen v8 中,我可以访问artisan schedule:*
命令。
将流明升级到 v9 后:
工匠命令控制台缺少artisan schedule:*
命令(如artisan schedule:run
)!
它们在 lumen v9 中被移除了吗?文档没有提到它们是否是。 https://lumen.laravel.com/docs/9.x/releases
谢谢!
php - PHP 类可以在不调用方法或变量的情况下返回一个类数组吗?
在 PHP 中,我希望能够遍历一组类以帮助设置、插入和验证值。在方法 args 中使用类作为类型将使代码更加严格,这将有助于避免错误。
我能够访问该集合,但只能通过公共数组或方法($values->array
或$values->get()
)。我希望能够$values
直接用于更简洁的代码。例如,要访问引用,我需要使用$values->array[0]
or$values->get()[0]
而不是$values[0]
. 如何用 PHP 实现这一点?
预期用途:
课程:
php - 我如何将这个奇怪的 PHP 行翻译成不那么紧凑的东西?
我有这段代码,它是我用来确定给定字符串是否是保留的 PHP 关键字的函数的一部分(因为 PHP 没有内置的函数):
它使 PHPStan 吠叫:
参数 #1 $array of function reset 需要给出 array|object, array<int, int|string>|string。
我不知道为什么,但希望错误消失,所以我试图“展开”这条紧凑的线路,但我意识到我不明白它在做什么。你能解释一下并帮助我吗?我经常发现将事情分成单独的行/操作会使 PHPStan 停止吠叫。
php - PHP 8.1 中是否有特定类的对象数组的类型提示?
是否有类型提示PHP 8.1
允许用于ExampleClass[]
声明它是类的对象数组ExampleClass
?
在我的具体情况下,ExampleClass
称为Task
我想要但不起作用:
我的 PHPStorm IDE 告诉我,复数类型只允许在文档类型
中使用- 说只有在PHPDoc
使用中才Tasks[]
可以。但我想使用普通的 PHP。
错误是
:PHP Parse error: syntax error, unexpected token "[", expecting variable
如果我只需要一个对象Task
而不是一组对象Task[]
,它将使用:
这是我目前的工作解决方法:
php - PHP file_get_contents() 和 curl_exec() 从网站失败,但从命令行工作
使用一行代码创建 .test.php 文件:
当我从浏览器打开 .test.php 时,它显示 bool(false) 但是当我从命令行运行它时,它按预期显示我的 WAN IP。
我正在使用 CentOS 9、nginx 1.20.1 和 PHP 8.1.3(虽然我也尝试过 RHEL8 和 Apache)
我尝试设置/etc/php-fpm.d/www.conf以使用我的用户 ID 和组来确保这不是权限问题。
phpinfo() 显示allow_url_fopen设置为 On 并且 curl 7.76.1 已启用并且 OpenSSL 已启用版本 3.0.1
我还尝试了一个 http: URL
我还尝试在 .php 文件中使用curl()库,这些库以相同的方式失败。
如果调用php -v或另一个 .php 文件,则从 .php 文件调用exec()有效,但如果调用curl则无效
不知道还能尝试什么,所以我可能会再次对整个服务器进行核攻击。
更新:在 /var/log/nginx/error.log 中找到了这个
FastCGI sent in stderr: "PHP message: PHP Warning: file_get_contents(https://checkip.amazonaws.com): Failed to open stream: Permission denied
怎么办?