php-7 相关问题

PHP 7是PHP 5.6的继承者,它于2015年12月3日发布。使用此标记用于与使用PHP 7开发相关的问题

返回类型为 void

我正在使用 PHP 7 测试返回类型。 我创建了一个简单的脚本来测试 PHP 7 的返回类型: 我正在使用 PHP 7 测试返回类型。 我创建了一个简单的脚本来测试 PHP 7 的返回类型: <?php Class Obj { public function __construct(){ } public function test(): string { //a string needs to be returned return "ok"; } } function foo(): Obj { //instance of Obj needs to be returned return new Obj(); } $o = foo(); echo $o->test(); // output: ok 现在在其他编程语言中,当您指定返回类型时void,这意味着您无法返回任何内容,否则会收到错误。所以我写了这个脚本: <?php function foo(): void { } foo(); 现在在上面的脚本中,预期的输出什么也没有。 相反,它给了我一个致命错误: 致命错误:foo()的返回值必须是void的实例,第2行没有返回 我的问题是(我找不到),在 PHP 7 中会有类似的 void 类型吗? 编辑: 针对 void 返回类型的新单独 RFC 已发布,已通过投票,并在 PHP 7.1 中实现。 PHP 中现在有一个 void 返回类型。 :) 原帖: 取自wiki.php.net: 未来的工作 超出本 RFC 范围的未来工作想法包括: 允许函数声明它们根本不返回任何内容(Java 和 C 中为 void) 所以目前没有办法声明您不退回任何东西。 我不知道在你的情况下什么是最好的,但我可能会暂时不声明返回类型。 回答你的问题 PHP 7 中是否会有 void 返回类型: 目前还没有 保证,但我认为 void 或同义词很可能会以某种方式实现。 php 7.1 接受 void返回类型。所以它会在未来出现。 有关其工作原理的一些示例: function should_return_nothing(): void { return 1; // Fatal error: A void function must not return a value } function returns_null(): void { return null; // Fatal error: A void function must not return a value } function lacks_return(): void { // valid } function returns_nothing(): void { return; // valid } 请参阅 Andrea Faulds 的 RFC 了解更多信息! 编辑:在 PHP 7.1 中,有一个 void 伪类型。它在Void Return Type RFC中定义。以下是 7.1 之前的答案。 返回类型 RFC 的作者在这里。在 PHP 7.0 中,不会有 void 返回类型,因为 RFC 没有添加它,任何其他针对 PHP 7.0 的 RFC 也没有添加它。 如果我们决定为次要版本添加新的关键字/保留字是可以的,即使它们会破坏代码,则类型 void 可以存在于 PHP 7 系列中。这有点不确定,但它是在 PHP 5.4 中使用 callable 关键字完成的。 就个人而言,我认为我们不需要void;我们已经有了 null。 来自手册: 特殊的NULL值表示没有值的变量。 NULL 是 null 类型唯一可能的值。 在 PHP 中,不返回任何内容的函数将隐式返回 null。这意味着您永远无法“实际上”返回任何内容*。走 null 路线意味着不会出现向后兼容性中断,因为 null 不会是从 PHP 7.0 开始的有效类/接口/特征名称,并且不会添加任何新键或保留字。 *熟悉 Zend 引擎的人会意识到你可以不返回任何内容,但如果你不返回任何内容,你正在分配的变量将被分配为 null,这使得它们在逻辑上是等效的。 php 中没有 void 的等效类型, 返回空值;可能符合您的要求,因为它没有任何类型,如 0 或任何其他值。注意:实际无效意味着没有返回。 @BeNice 我理解你的观点,无论如何我总结了以下考虑 Levi Morrison 作为可持续发展的一个实际问题:引入 void 作为可能的回报类型事实上,我们打破了 null 唯一可能类型是 null 的假设。 这样,应该返回void来进行null的类型检查,通过设计改变架构约束并导致向后兼容性混乱。 // your choice implies this comparison should be true: gettype(null) === void; 我认为在代码中不经常使用 null 的人将承担 void 类型实现。 虽然当你设置返回类型为void时你不能返回任何东西,但是你可以在函数中打印一些东西。 类似这样的事情。 <?php function foo(): void { print "OK"; return; } foo(); ?> 这将打印“OK”,但它不返回任何内容。 另外,需要注意的是,我们只能使用 void 作为返回类型。我们不能将它用作函数参数类型。 示例: function myfunction(void $param) { } 它将产生这个致命错误 // Fatal error: void cannot be used as a parameter type 此外,如果您使用OOP,则无法在继承期间更改void返回类型。 示例: class MyClass { public function myMethod(): void { } } class MyNewClass extends MyClass { public function myMethod(): array { } } 这将产生这个致命错误 Fatal error: Declaration of MyNewClass::myMethod(): array must be compatible with MyClass::myMethod()

回答 6 投票 0

Symfony:在 Doctrine 实体方法中使用返回类型提示的表单问题

我今天异常勤奋,决定返回类型提示我所有的 symfony 实体方法。所以: 我今天异常勤奋,决定返回类型提示我所有的 symfony 实体方法。所以: <?php Class User { private string $username; public method getUsername(): string {} } 一切都很好,直到我制作了一个表单来创建新用户: $user = new User(); $this->createForm(SignupType::class, $user); 当显示表单时,Symfony 会自动获取 User $user 这个新实例的属性。但由于它是一个新的实例化,它的 username 属性当然仍然是 null,这是一个不正确的返回类型,因为它需要是 string。 我应该: Symfony 实体中没有返回类型提示(meh); set $username = ''(但这有点违背了不允许空白的目的,我可以看到各种错误的演变);或 取消映射 symfony 表单上的字段 其他可能的解决方案... 如果实体属性不能是 null(并且您使用 PHP 7.1+),那么应用 可空返回类型声明听起来更像是一种肮脏而快速的解决方法,以维护实体和表单之间的直接数据绑定(使用 Symfony 表单组件)。 更好的全局方法(在我看来)是使用 DTO(数据传输对象)将表单数据绑定与 Doctrine 实体解耦,这是一个简单的 POPO(普通旧 PHP 对象)来包含您的形成数据。 使用 DTO 将允许您在 Doctrine 实体中维护严格的类型提示(不会丢失数据一致性),并将表单数据绑定(还有数据验证)与实体解耦。 DTO 允许重复使用并具有许多其他优点。 有关将 DTO 与 Symfony Forms 一起使用的一些有用参考: DEAD LINK 避免表单中的实体(作者:Iltar van der Berg) DEAD LINK 重新思考表单开发(作者 Iltar van der Berg) Symfony Forms 101(由 Form 组件的创建者 Bernhard Schussek) 不要在 Symfony 表单中使用实体。请改用自定义数据对象 实体应始终有效 如果您使用的是 PHP 7.0,它不支持可为 null 的返回类型声明,则第一个选项将是正确的(非 hacky)选择。如果您使用 PHP 7.1+,您可以定义一个 可空返回类型声明。 <?php class User { public function getUsername(): ?string {} }

回答 2 投票 0

PHP 7 和严格的“资源”类型

PHP 7 支持资源的严格类型吗?如果是这样,怎么办? 例如: 声明(strict_types=1); $ch=curl_init(); 测试($ch); 功能测试(资源$ch) { } 该...

回答 3 投票 0

我可以检查 ReflectionType 是否是另一种类型的实例吗?

我想检查可调用对象的返回类型是否是另一种类型的实例。例如,假设我有: 扩展了 Animal 的 Pigeon 类。 函数 addSupplier() 接受一个可调用的 ar...

回答 1 投票 0

三元运算符中如何处理比较运算符(宇宙飞船运算符)

这个问题有点先发制人,因为 php 7 还没有发布。我很好奇在三元运算符的上下文中如何处理宇宙飞船运算符。 所以如果我有一个预宇宙飞船测试...

回答 3 投票 0

PHP 7.0 STRPOS 未按预期运行

所以,我试图使用 strpos 来测试变量中是否存在字符串,但是在我使 if 语句起作用的所有尝试中,它都没有成功,所以我开始输出字符串并尝试...

回答 2 投票 0

避免 php 二维数组中的字符串元素

说明: 我有一个二维数组: $array = InvApplication::model()->findall(array('order'=>'app_name')); 数组包含下一个元素:“app5”,如何避免它? 实际输出: 应用程序_n...

回答 1 投票 0

在 PHP7 中,在数组中创建子数组,其中两个键在两个元素中具有相同的值

我正在尝试采用这样的数组: 大批 ( [0] => 数组 ( [型号 ID] => 1 [会员 ID] => 25 [comment_text] => 我对此感觉良好 [创建...

回答 2 投票 0

重定向期间使用 PHP7 的 AJAX 出现错误 500

我将网站从 php5.5 切换到 php7,现在有一个非常奇怪的错误:当我执行包含重定向的特定 ajax 请求时,服务器以 http 500 错误代码应答,同时返回...

回答 1 投票 0

从 PHP 5 更改为 PHP 7 后生成 .xls 时出现问题

我最近从 PHP 5.6 切换到 PHP7。以前在 PHP 5.6 中运行良好的 PHP 脚本现在在 PHP 7 中复制列数据。我不明白为什么。代码: 函数 cleanData(&$str...

回答 2 投票 0

Ubuntu 20.04、PHP 7.4:已安装 mbstring 但未启用

我正在运行 Ubuntu 20.04,并使用 PHP 7.4。 在 phpBB 安装期间,报告“为了使 phpBB 正常运行,需要使用 PHP mbstring 扩展”。我...

回答 4 投票 0

过滤、展平和重命名多维数组中的键(五月花/假日)

我正在 Laravel 7 中使用 Mayflower/Holidays 来获取我所在地区的假期列表。我得到的 Json 是: {"2":{"type":"假期","name":"我的洒红节...

回答 2 投票 0

php8 mysqli 错误处理现在可以像在 php7.4 中一样工作

所以,我曾经使用php7.4版本,我会捕获任何mysqli错误,如下所示: $json = []; $sql = "从客户中选择*"; if ($结果 = $conn->查询($sql)) { // 处理成功

回答 1 投票 0

这个检查 URI 方案、检查 http、https 和 shttp 协议的 PHP 正则表达式可以写得更好吗?

我用 PHP7 编写了一个正则表达式来验证 URI 方案,目的是支持 IANA 在此列出的每个方案;永久的、临时的或历史的。到目前为止我已经了解了 shttp ...

回答 2 投票 0

ZendGuard 类似于 php 7.4.x [已关闭]

我需要加密我的 php 项目,但 ZendGuard 已停产并且不支持 php 7.4。 还有其他选择吗?

回答 1 投票 0

如何在 Ubuntu 上更改 PHP 版本

我已经在 Ubuntu 上安装了 PHP 7: php-v PHP 7.0.5-2+deb.sury.org~trusty+1 (cli) ( NTS ) 版权所有 (c) 1997-2016 PHP 集团 Zend Engine v3.0.0,版权所有 (c) 1998-2016 Zend Technologies 机智...

回答 6 投票 0

laravel 错误 1071 密钥太长 php artisan migrate [重复]

我正在使用 Laravel,并且我有以下功能的迁移: 公共函数 up() { Schema::create('产品', function (Blueprint $table) { $table->increments('id'); ...

回答 1 投票 0

PHP 的 spaceship 运算符到底如何比较字符串、数组和对象?

我想知道 PHP spaceship 运算符如何比较字符串、对象和数组。例如下面的代码。 echo "这是我在 SO" <=> "这是我在 SO"; 将返回 0, a...

回答 4 投票 0

如果将指数数传递给其函数,PHP BCMath 无法处理指数数,PHP BCMath 返回“bcmath 函数参数格式不正确”

我正在研究一些小数,例如 0.0000687、0.0000063241、0.0000454。我用BCMath来得到最精确的结果,因为它涉及到金钱计算,到目前为止BCMath它是v...

回答 2 投票 0

php spaceship 运算符如何比较字符串、数组和对象

我想知道 php spaceship 运算符如何比较字符串、对象和数组。例如下面的代码。 echo "这是我在 SO" <=> "这是我在 SO"; 将返回 0,据我所知所有字符...

回答 4 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.