PHP静态方法

时间:2017-04-26 10:38:33

标签: php static-methods

我理解静态方法无法访问其类类型的实例对象的状态,因此在其中引用$this会导致错误。但是对象可以使用对象到成员运算符{{1}引用静态方法}

->

甚至可以通过参数传递它们的状态。

$obj->staticMethod();

在静态上下文中解析静态时,最后一个示例是如何实现的。如果有人可以向我解释一下php代码中静态的一般行为。你甚至可以谈论$para1 = $obj->para1; $para2 = $obj->para2; $obj->staticMethod($para1, $para2); 相关的概念,如果有帮助的话。

2 个答案:

答案 0 :(得分:2)

由于您声明已经了解static的含义,我将跳过这一点。

但是,引用PHP的documentation on the static keyword可能仍然不错。特别是以下两个警报很重要(实际上很难看一眼)。

  

注意在PHP 5中,静态调用非静态方法会生成 E_STRICT 级别警告。

这一个(斜体强调我的)。

  

警告在PHP 7中,不推荐静态调用非静态方法,并会生成 E_DEPRECATED 警告。 将来可能会删除对静态调用非静态方法的支持。

所以,简而言之:是的,你的例子将会运行(现在),因为PHP解释器会尝试修复你的错误。但是你应该永远不要这样做。 PHP解释器将做的是:

说明您的$obj类型为Foo。然后它会读

$obj->staticMethod($para1, $para2);

得出结论staticMethodstatic而是执行

Foo::staticMethod($para1, $para2);

传递Foo实例属性的参数当然是完美的。 staticMethod参数的来源无关紧要。

详细说明其原因,但不允许在$this方法中使用static

您可以将常规方法视为具有一个额外的static函数:它们接收隐式参数$this$this的值只是调用该方法的对象。因此,$obj->do($a, $b, $c)相当于调用Foo::do($obj, $a, $b, $c)并命名do$this的第一个参数。这很方便,因为我们现在可以轻松定义处理对象实例的方法,而无需一遍又一遍地明确说明此实例是我们方法的参数。大。

现在回到static个功能。与普通方法的唯一区别是它们不会收到此隐式$this参数。因此,在其中使用$this无效。不是因为它被禁止,而是因为它没有引用任何东西。 PHP没有(并且不能)了解$this应该引用的内容。

另一种看待它的方式。假设我们的Foo类有两个属性:$para1$para2,这两个属性。假设您编写了一个返回这些数字之和的方法。一种方法是这样做:

public static function sum($para1, $para2) {
  return $para1 + $para2;
}

大。作品。但是,必须像这样调用它是很烦人的

$sum = Foo::sum($obj->para1, $obj->para2);

所以,这就是方法!

public function sum(/* implicit $this parameter */) {
  // write looking up the properties once inside the function, instead
  // of having to write it every time we call the function!
  return $this->para1 + $this->para2;
}

// ...

$sum = $obj->sum(); // $obj is passed implicitly as $this

因为静态函数没有收到隐式$this参数,所以在它们内部使用$this就像在你从未定义它时尝试使用$undefined一样。因此,无效。

答案 1 :(得分:0)

静态表示班级成员,简单来说,静态数据成员在一个类中可访问,无论对象如何是否创建。 静态函数也是专用于整个类的函数。静态函数仅适用于静态数据,有时可能会有所不同。虽然静态是专用类,但您可以使用对象访问它们。它允许使用所有语言。为什么?因为可行性。如果对象无法访问静态成员,则这是一个限制。