PHP 静态方法

PHP static methods

我知道静态方法无法访问其 class 类型的实例对象的状态,因此在其中引用 $this 会导致 error.But 对象可以引用静态方法使用反对成员运算符 ->

$obj->staticMethod();

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

$para1 = $obj->para1;

$para2 = $obj->para2;

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

当在静态上下文中解析静态时,最后一个示例如何可能。如果有人可以向我解释 php 代码中静态的一般行为。如果有帮助,您甚至可以讨论 C 相关概念。

Static简单来说就是class成员,一个static数据成员 在 class 中 可访问 ,无论是否创建对象。 static 函数 也是专用于整个 class 的函数。静态函数仅适用于静态数据,它有时会发生变化。虽然静态是 class 专用的,但您可以使用对象访问它们。它在所有语言中都被允许。为什么 ?因为可行性。如果一个对象不能访问静态成员,那就是一个限制。

既然你说你已经理解了static的意思,那我就跳过了。

不过,参考一下PHP的documentation on the static keyword可能还是不错的。特别是以下两个警报很重要(实际上很难一目了然)。

Caution    In PHP 5, calling non-static methods statically generates an E_STRICT level warning.

还有这个(斜体强调我的)。

Warning     In PHP 7, calling non-static methods statically is deprecated, and will generate an E_DEPRECATED warning. Support for calling non-static methods statically may be removed in the future.

所以,长话短说:是的,您的示例将 运行(暂时),因为 PHP 解释器会尝试为您纠正错误。但是你应该永远不要这样做。 PHP 解释器将做的是:

假设您的 $objFoo 类型。然后它将读取

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

断定 staticMethodstatic 而是执行

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

传递属于Foo实例属性的参数当然是完全没问题的。 staticMethod参数从哪里来并不重要


详细说明为什么会这样,但不允许在 static 方法中使用 $this

您可以将普通方法视为具有一个额外功能的 static 函数:它们接收一个隐式参数 $this$this 的值只是调用该方法的对象。因此,$obj->do($a, $b, $c) 等同于调用 Foo::do($obj, $a, $b, $c) 并将 do 的第一个参数命名为 $this。这很方便,因为我们现在可以轻松地定义在对象实例上工作的方法,而不必一遍又一遍地显式声明该实例是我们方法的参数。太好了。

现在回到 static 函数。与普通方法的唯一区别是它们不接收此隐式 $this 参数。因此,在其中使用 $this 是无效的。不是因为它被禁止,而是因为它没有引用任何东西。 PHP 不知道(也不能)知道 $this 应该指的是什么。

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

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 一样。因此,无效。