在PHP中声明静态函数有什么意义?

时间:2011-08-10 06:56:10

标签: php class function static static-methods

所以在PHP中你可以拥有

Class A{
   function B(){}
}

你可以把它称为静态函数:

A::B();

我的问题是......如果我能做到这一点,那么我为什么要将函数B()声明为静态,因为这样做会使$ this不可用,所以灵活性较差,所以你有一切都要输,但没有什么可以增益...

还是有一个优点,即将该函数声明为静态,我不知道?

我也听说过“非静态方法的静态调用”被“弃用”了......这与这种情况有什么关系呢?当B()没有被声明为静态的东西时,我不应该调用A::B()吗?如果是这样,为什么会这样呢?

4 个答案:

答案 0 :(得分:11)

因为PHP在严格性(?)方面往往有点松散 - 这些东西都有效。它们被弃用的事实意味着在将来的版本中,很可能可以继续工作。因此,如果您在静态上下文中调用非静态函数,则您的程序可能会在将来的PHP升级中中断。

至于现在使用它 - 将函数声明为静态的优点是你正在决定应该如何使用该函数。如果您打算在静态上下文中使用某个函数,那么无论如何都不能使用$ this,因此您最好只清楚自己打算做什么。如果要静态使用该功能,请将其设置为静态。如果你不这样做,那就不要了。如果您想静态和非静态地使用某个功能,请重新检查您的要求:P

答案 1 :(得分:1)

用于兼容模式。现在,静态调用非静态方法会生成E_STRICT级别警告。

为什么静态而不是实例化对象?每个程序员都会告诉你一个原因。我特别喜欢使用静态方法实例化对象。它清晰,可追溯,更可重复使用。

我做了一个测试工作台,实例化和调用方法之间的差异最小,而不是静态调用它。

提示:如果您预见到调用方法也会静态定义它们; - )

答案 2 :(得分:1)

首先,你不能用像Java这样的严格类型的语言在你的帖子中做类似的事情。如果在静态上下文中调用非静态内容,则Java代码无法编译。 PHP对这些事情并没有那么严格(但是),但你仍然不应该仅仅因为你可以做,尽管这是不好的做法,在某些语言中甚至是“不正确的”练习。

使用静态方法肯定有优点。你没有获得任何东西甚至失去灵活性是不对的。我们举个例子:

class A {

  private static $prop_a = 'property_a';

  public static function b() {
    echo 'called b()';
    echo self::$prop_a;

    $A = new A();
    $A->c();
  }

  public function c() {
    echo 'called c()';
  }
}

现在我们可以这样调用这个类:

A::b();

输出

  • called_b
  • property_a
  • called_c

但你也可以这样做:

$a = new A();
$a->b();
$a->c();

c()现在执行了两次,但你明白了。在你的班级中,你可以实现类本身,并像使用常规对象一样使用它。但是从外部来看,它只是一行代码,而它是使用非静态方式的3行。很酷,对吧?

如您所见,您可以在非静态上下文中使用静态函数,这意味着您可以将方法声明为静态,但是如果您实例化了类,则可以像普通方法一样调用它。听起来很灵活;)

不,你不能在静态上下文中使用$this,但这就是self的用途;)

答案 3 :(得分:-3)

如果它是静态函数,则不必实例化该类以使用该方法。

Class A {
  static function hello($arg)
  {
    echo 'Hello, ' . $arg;
  }
}

A::hello('world');

VS

Class A {
  public function hello($arg)
  {
    echo 'Hello, ' . $arg;
  }
}

$a = new A;
$a->hello('world');

这里重要的是对象的实例化。在实例化对象之后,可以对其进行操作,并且调用方法可能会产生意外结果。如果您的值和函数在类中静态声明,则在调用函数时无法修改它们。

这并不是说你应该总是使用静态方法。采取以下示例。

class My_math {
  static function pi()
  { 
   return 3.14
  }
}

class My_bakery {
  private var $pie;  

  function set_pie($pie)
  {
    $this->pie = $pie;
  }
  function pie()
  {
    echo "I made you a " . $this->pie . "pie";
  }
}

我已经让My_Math返回一个常量值,因为我知道pi不会改变。但是在My_bakery中,有些日子我想要蓝莓派,有些日子我想要桃子派。

相关问题