【问题标题】:will strictly defining class variables in php 7.4 be faster?在 php 7.4 中严格定义类变量会更快吗?
【发布时间】:2020-07-20 19:05:20
【问题描述】:

在 php 7.4 中,我现在可以定义类属性类型:所以而不是:

class A{
  /** @var string */
  protected $string;
}

我现在可以做:

class A{
  protected string $string;
}

那么,这样做值得吗?即,是否值得重新编写我的代码库以使用此功能?

有没有性能提升?

【问题讨论】:

  • 更多的是关于数据完整性,而不是性能。这样你就可以确定一个属性总是有一个特定的类型,如果类型很重要,你就不需要对它们进行类型检查。如果有任何性能收益/损失,它们很可能可以忽略不计。
  • 谢谢,我明白了,我只是想知道编译器是否进行了优化以使代码运行得更快,从功​​能上讲,我的 IDE 从语义上理解 $string 是一个字符串,所以如果我尝试一些愚蠢的事情,它会警告我$字符串 = $字符串 + 1;等等……
  • wiki.php.net/rfc/typed_properties_v2 - "主要的收获是,即使不使用类型化的属性也会对性能产生影响。对于应用程序,影响在 1-2% 左右。我们预计着陆前性能会有所提升,但至少有一些影响可能是无法避免的。”
  • @MagnusEriksson 谢谢,如果你回答我可以接受。干杯。
  • 请注意,我的类型化/非类型化示例使用不同的代码(因为这是我试图说明的内容),结果基本上不一致。您需要对 your 服务器中的 your 代码进行基准测试,以得出与您相关的结论。老实说,我认为这不值得,我同意 Magnus 的观点:使用使您的代码更可靠或更易于维护的设计;性能权衡可能可以忽略不计。

标签: php optimization php-7.4


【解决方案1】:

这与性能无关,类型化属性旨在在您的代码中强制执行类型协定。很难说是否有任何性能差异,无论是正面还是负面,但性能不应该是您应该指定类型的原因。

您已经使用 PHPDoc cmets,这意味着您知道属性应该是什么类型很重要,但是 PHPDoc 块不强制执行它。此代码完全有效:

<?php

class A {
    /** @var int */
    public $number;
}

$a = new A();
$a->number = 'a';
echo $a->number;

使用类型化属性,您可以告诉 PHP 运行时在分配或使用之前检查类型。 PHP 不允许类型不匹配。这段代码会报错:

<?php

class A {
    public int $number;
}

$a = new A();
$a->number = 'a';
echo $a->number;

致命错误:未捕获的 TypeError:无法将字符串分配给 int 类型的属性 A::$int

【讨论】:

    猜你喜欢
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多