何时在PHP中使用静态方法/字段?

何时在PHP中使用静态方法/字段?,php,static,Php,Static,什么时候应该在PHP中使用静态函数/类/字段?它的一些实际用途是什么?在Java/PHP等语言中使用相同的静态方法 一个简单的例子是,您希望在类的所有实例中使用一个变量,任何实例都可以更改其值,并且您希望它也反映在其他实例中 class Foo{ static $count=0; public function incrementCount(){ self::$count++; } public function getCount(){ re

什么时候应该在PHP中使用静态函数/类/字段?它的一些实际用途是什么?

在Java/PHP等语言中使用相同的静态方法

一个简单的例子是,您希望在类的所有实例中使用一个变量,任何实例都可以更改其值,并且您希望它也反映在其他实例中

   class Foo{
    static $count=0;
    public function incrementCount(){
    self::$count++;
    }

   public function getCount(){
    return self:$count;
   }
  }

如果没有static,您无法通过一个对象设置计数值,并在其他对象中访问它。

您不应该这样做,因为它很少有用。 静态的常见用法是工厂方法和singleton::instance()

工厂:

class Point{
  private $x;
  private $y;

  public function __construct($x, $y){
    ...
  }

  static function fromArray($arr){
    return new Point($arr["x"], $arr["y"]);
  } 
}
单身人士:

class DB{
  private $inst;

  private function __construct(){
    ...
  }

  static function instance(){
    if ($this->inst)
      return $this->inst;

    return $this->inst = new DB();
  }
}

当我需要类中的简单函数时,我偶尔会使用静态方法,我也会在类外使用这些函数,例如:

在UserProfile类中,我有一个返回数组的方法,该数组用于在从html页面填充数组后将数据传递回类

    Class UserProfile{

        Public Static get_empty_array(){

            return array('firstname'=>'',lastname=>''); //usually much more complex multi-dim arrays

        }

    }
这样,可以在类/对象内部和外部使用空数组作为起始模板。 对于通常是独立函数的函数,我也使用静态方法,但我希望将它们保留在类中,这样它们就可以一起使用,但也可以作为静态方法在外部使用,例如:

    public static convert_data($string){

        //do some data conversion or manipulating here then

        return $ret_value;


    }

    $converted_data = class::convert_data($string);

我确实维护了一个通用用户定义函数库,但我发现在与它密切相关的类中包含一些函数很方便。

我同意这基本上是没有必要的,也是有害的。我想添加一个有用的例子:创建更高级别的语言。例如User::with100点()。在《测试引导的面向对象软件的成长》一书中可以找到更多内容。@koen进一步解释一下,User::with100points()如何工作?@如果您指的是代码中的外观,请单击Upvote:类用户{public function setPoints($points){//set points}public static function with100points(){返回新的自我(100);}。User::with100points()比$User=new User()更具可读性$用户->设定点(100);您可以为此DSLUser extends User{public static method with100points(){}创建一个特殊类。在代码中正确使用它的机会不多,但在单元测试中,您可以更多地使用它,并且您的测试通常会变得非常清楚。如果您尝试编写面向对象的代码:从不。有点像给全局函数命名。另一种说法是:如果方法不影响对象的状态,它是静态方法的一个很好的候选者。