何时使用和不使用静态函数


When to use and not to use static function?

我的同事说,当你执行不需要任何扩展的固定内容时,静态是好的,但有一天我们需要在他的代码之上添加功能。哎呀,我们必须修改 ori 代码,因为他使用了大量静态的东西,而且我们继续下去并不灵活。

class test {
    public static function test1() {
        echo 'hi';
    }
}
test::test1();

为什么要使用静态函数?什么时候使用它而不是使用静态函数?

当函数不依赖于应用该方法的特定对象时,可以使用 static。如何将其应用于您的应用程序取决于其设计。

例如,如果你有一个用于处理日期和时间的类,并且它包含一个返回当前时间戳的函数,则不需要将其应用于特定的日期对象 - 它对于任何日期都是一样的。所以它可能是一个静态函数。

如果需要在创建类的任何实例之前运行某些函数,则可能需要静态函数。如果使用工厂模式,则首先将使用一种方法来创建实例。这必然是一种静态方法。

作为一般经验法则,最好尽可能远离静态代码。 当您开始使用静态调用时,您将类紧密耦合到您的代码中。 这使得以后当您想要将静态类换成模拟类时,很难测试您的代码。 在大多数情况下,最好改用依赖注入。

也就是说,像糖和盐一样,静态代码也有它的位置,如果你小心并正确使用它,你可以拥有与你的静态代码很好地配合的应用程序。 例如,单一实例模式依赖于静态方法来获取对单一实例本身的引用。 静态方法适用于不需要依赖任何类状态的基本实用程序函数。

最后,最好远离他们。 有些人称它们为邪恶(它们不是(,但如果你正在使用它们,至少花时间探索你为什么使用它们,以及静态类的设计是否比你的特定用例的具体设计更好。

如果需要函数而无需在之前调用 Class 构造函数,则可以使用静态函数。例如,我有这样的类:

class Animal {
 .............
 .........
  private function name() {
    // This will print name of Animal that you assign through $this
    echo $this->$name;
  }
}
Animal->name();

在另一种情况下,您希望为类实现一个不需要$this的函数。第二个:

class Animal {
 .............
 .........
  public static function splitName($name) {
    // In this case your source is assigned by parameter, not by $this
    echo explode("-",$name);
  }
}
Animal::splitName();

如果您是初学者,要轻松记住的是"如果您使用静态函数,数据源来自参数,然后对于私有函数,数据来自$this"......明白了?通过评论问我更多,詹姆斯