在php中将函数声明为静态

在php中将函数声明为静态,php,static-methods,Php,Static Methods,我有一组独立的函数,我想把它们放在一个类中。 它们不依赖于类的任何对象,因此在调用它们时,所需的所有值都将作为参数传递。 如果我将它们全部声明为静态,这样我就可以用一个命令调用它们,比如className::functionName(argument1,argument2,…) 还是将它们作为普通的公共函数保留,并通过类对象调用它们?是的,这还不错。 您可以将它们定义为静态函数,就像您所说的,您只需一条语句即可调用它们 class Foo { public static function

我有一组独立的函数,我想把它们放在一个类中。 它们不依赖于类的任何对象,因此在调用它们时,所需的所有值都将作为参数传递。 如果我将它们全部声明为静态,这样我就可以用一个命令调用它们,比如
className::functionName(argument1,argument2,…)
还是将它们作为普通的公共函数保留,并通过类对象调用它们?

是的,这还不错。 您可以将它们定义为静态函数,就像您所说的,您只需一条语句即可调用它们

class Foo {
   public static function bar( ) {
      echo "bar called";
   }
}
是的,这还不错。 您可以将它们定义为静态函数,就像您所说的,您只需一条语句即可调用它们

class Foo {
   public static function bar( ) {
      echo "bar called";
   }
}
你可以(但你不应该这么做):

您不应该这样做的原因是,当您在其他类/函数/任何对象中使用静态调用时,您已经将
YourClass
紧密地耦合到了其他类。因此,您很难进行单元测试,或者干脆切换到另一个moethod而不去尝试使用它的所有代码。另外,别忘了您刚刚添加了一些
global
ly

你还说:

我有一组独立的函数,我想把它们放在一个类中

在我的书中,这是一个很大的代码气味。这听起来像是您的类违反了中的规则

因此,我只需实例化该类

让我们看看为什么它会使您的代码难以测试:

class SomeClassWithMethods
{
    public static function doSomething()
    {
    }
}

class SomeClassYouWantToTest
{
    public function doSomething()
    {
        return SomeClassWithMethods::doSomething(); // this is now tightly coupled and would be impossible to mock when unit testing it
    }
}
另外,
SomeClassWithMethods::doSomething
现在是全局定义的

我们称之为银弹:):

你可以(但不应该这样做):

您不应该这样做的原因是,当您在其他类/函数/任何对象中使用静态调用时,您已经将
YourClass
紧密地耦合到了其他类。因此,您很难进行单元测试,或者干脆切换到另一个moethod而不去尝试使用它的所有代码。另外,别忘了您刚刚添加了一些
global
ly

你还说:

我有一组独立的函数,我想把它们放在一个类中

在我的书中,这是一个很大的代码气味。这听起来像是您的类违反了中的规则

因此,我只需实例化该类

让我们看看为什么它会使您的代码难以测试:

class SomeClassWithMethods
{
    public static function doSomething()
    {
    }
}

class SomeClassYouWantToTest
{
    public function doSomething()
    {
        return SomeClassWithMethods::doSomething(); // this is now tightly coupled and would be impossible to mock when unit testing it
    }
}
另外,
SomeClassWithMethods::doSomething
现在是全局定义的

我们称之为银弹:):


你能更清楚地说明我不该这么做的原因吗it@user1085195他很清楚。它引入了紧密耦合的代码,这违反了单一责任原则。
SomeClassYouWantToTest
依赖于
SomeClassWithMethods
,而它不告诉任何人。这种依赖性隐藏在背后,无法更改,也没有适当的文档记录。PHP没有类内上下文名称解析,因此这是固定的。这一定不坏,但如果您在应用程序的多个层/进程中以串行方式这样做,您应该诚实地承认:让我们做过程编程,并正确地这样做,我知道我在做什么。最悲哀的是,大多数人都不知道其中的一个或两个,所以他们把一切都搞混了,这对我来说真的很糟糕。你能更清楚地解释一下我不应该做的原因吗it@user1085195他很清楚。它引入了紧密耦合的代码,这违反了单一责任原则。
SomeClassYouWantToTest
依赖于
SomeClassWithMethods
,而它不告诉任何人。这种依赖性隐藏在背后,无法更改,也没有适当的文档记录。PHP没有类内上下文名称解析,因此这是固定的。这一定不坏,但如果您在应用程序的多个层/进程中以串行方式这样做,您应该诚实地承认:让我们做过程编程,并正确地这样做,我知道我在做什么。最常见的悲惨故事是,大多数人不知道其中一个或两个,所以他们把所有的东西都弄混了,这就变得非常需要维护