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 解释器将做的是:
假设您的 $obj
是 Foo
类型。然后它将读取
$obj->staticMethod($para1, $para2);
断定 staticMethod
是 static
而是执行
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
一样。因此,无效。
我知道静态方法无法访问其 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 解释器将做的是:
假设您的 $obj
是 Foo
类型。然后它将读取
$obj->staticMethod($para1, $para2);
断定 staticMethod
是 static
而是执行
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
一样。因此,无效。