【问题标题】:Is there a difference between using use and passing the class path to a method?使用 use 和将类路径传递给方法之间有区别吗?
【发布时间】:2021-04-12 02:25:28
【问题描述】:

在 PHP 中有两种使用命名空间类的方法:

使用导入 (use) 声明:

use The\Class\NameSpace\MyClass;
...
public function myFunction(MyClass $myClass) {
    // Things to do
}

每次使用类时都使用完全限定名:

public function myFunction (\The\Class\NameSpace\MyClass $myClass) {
    // Things to do
}

在性能方面,哪种方法更好?

【问题讨论】:

  • 我会考虑哪个更易读,哪个更快。如果你多次使用同一个类 - 你可以(理论上)使用不同的类 - 所以这取决于你的情况(恕我直言)。
  • 在性能方面,为什么不对其进行基准测试并告诉我们
  • PHP 代码编译成opcodes that are understandable to the Zend virtual machine (VM)。无需过多介绍:从 VM 的角度来看,这两种方法是等效的。
  • 我同意@KIKOSoftware 的评论,这应该变成答案。从技术上讲,如果您没有在顶部使用 namespace 声明,并且您在整个文件中对类使用 FQN 数百或数千次,则文件会逐字节增大,这可能会影响性能来自一个直接的解析器,但仅此而已。

标签: php performance class oop namespaces


【解决方案1】:

这两种方法在功能上是等效的。

两者都没有性能优势。

代码在执行之前编译,两种样式都不会影响编译或执行时间。

编写一个非常简单的基准测试自己验证它是微不足道的:

// Foo.php
namespace Bar;

class Foo
{

    public int $a;
    public function __construct(int $a)
    {
        $this->a = $a;
    }
}
// test.php
require 'Foo.php';

function footest(Bar\Foo $a): void
{
    $a->a++;
}

$t1  = microtime(true);
$foo = new Bar\Foo(1);
for ($i = 0; $i < 200000000; $i++) {
    footest($foo);
}
$t2 = microtime(true);

echo $t2 - $t1;

按原样运行,然后再次使用导入 (use) 语句,您将获得几乎相同的结果。

【讨论】:

    【解决方案2】:

    如果您将classpath 传递给方法,则该类将仅在该方法中可用。使用use 关键字只允许您在编写代码的类中的任何位置使用该类。因此,如果您在另一个类中多次使用X 类,最好使用use 来删除代码中的冗余。

    这是我能找到的唯一区别。除了该功能保持不变。

    【讨论】:

      猜你喜欢
      • 2014-09-25
      • 1970-01-01
      • 1970-01-01
      • 2011-11-25
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多