PHP:Namespace中的Class vs Global函数中的静态方法?

mcm*_*phy 4 php static namespaces global

在命名空间中创建全局函数(并从全局命名空间调用它)之间的区别是什么:

<?php
namespace MyNamespace  {
    function MyFunction($x, $y)  {
        return $x + $y;
    }
}

namespace {  //global code... in a new file
   var_dump(MyNamespace\MyFunction(1,2));
}
Run Code Online (Sandbox Code Playgroud)

并创建一个静态类方法,并从全局命名空间调用?:

<?php
class MyClass  {
    public static function MyFunction($x, $y)  {
        return $x + $y;
    }
}

var_dump(MyClass::MyFunction(1,2));
Run Code Online (Sandbox Code Playgroud)

是否有理由更喜欢一种方法而不是另一种方法?

DCr*_*tal 5

是否有理由更喜欢一种方法而不是另一种方法?

(下面假设你要求/引用静态类方法和命名空间中的函数之间的区别)

历史上(在命名空间到达之前),人们被迫使用具有静态函数的类来不污染全局命名空间.这是您可能更频繁地遇到此方法的原因之一.

如果您需要访问类的数据,或者您想要在后代类中覆盖它们(所谓的"灵活性和功能性"),您可能更喜欢使用静态方法.

当你想要的只是......呃,嗯......一个函数时,你可能更喜欢命名空间函数.想想一些util,functional或collections函数,比如compose/partial,retry,filter/map/some/every等.你可能不希望在子类中覆盖它,对吧?它既不需要访问某些静态类成员.

但是,(命名空间)函数存在一个特别恼人的问题,即类不会受到影响.它是自动加载的.简而言之,目前无法自动加载功能.这是你可能在实践中经常遇到静态方法(当它们不一定需要时)的类的另一个原因.