如何在同一类内的另一个方法中调用静态方法?
$this->staticMethod();
或者$this::staticMethod();
如何在同一类内的另一个方法中调用静态方法?
$this->staticMethod();
或者$this::staticMethod();
self::staticMethod();
$this
才存在,你只能在已经存在的对象内使用 $this->method
。如果没有对象而只是调用一个静态方法,并且在该方法中你想调用同一类中的另一个静态方法,你必须使用 self::
。因此,为避免潜在的错误(和严格警告),最好使用 self
。 - jeroen$this
调用了扩展控制器中的静态方法,但问题直到代码推送到 stage
才浮出水面。没有错误返回,值只是 0
。要小心处理这个问题,应该使用 self::
。 - blamb假设这是您的班级:
class Test
{
private $baz = 1;
public function foo() { ... }
public function bar()
{
printf("baz = %d\n", $this->baz);
}
public static function staticMethod() { echo "static method\n"; }
}
在 foo()
方法内部,让我们看一下不同的选项:
$this->staticMethod();
那么调用staticMethod()
会被视为实例方法,对吗?不是这样的。这是因为该方法声明为public static
,解释器将其视为静态方法进行调用,因此它将按预期工作。可以认为这样做使代码中发生静态方法调用的事实不太明显。
$this::staticMethod();
自 PHP 5.3 版本起,您可以使用 $var::method()
来表示 <class-of-$var>::
; 这相当方便,尽管上述用例仍然相当不寻常。 因此,我们来介绍一下调用静态方法的最常见方式:
self::staticMethod();
现在,在你开始认为::
是静态调用运算符之前,让我给你举另一个例子:
self::bar();
这将打印出baz = 1
,这意味着$this->bar()
和self::bar()
执行的是完全相同的操作;这是因为::
只是一个作用域解析运算符。它存在的原因是为了使parent::
、self::
和static::
起作用,并让您访问静态变量;方法的调用方式取决于其签名以及调用者的调用方式。
要在实际操作中看到所有这些内容,请查看此3v4l.org输出。
self::bar()
看起来有些误导 - 现在是否已经被弃用了?(使用 self::
调用实例方法而不是静态方法)。 - ToolmakerSteveself
。根据定义:静态方法可从任何地方调用,并且不接收“self”参数。尽管如此,我认为 php
语法很方便,这样您就不必编写 MyClassName::
。我习惯于静态类型的语言,其中编译器必须给出当前范围内所有可用变量,因此可以省略 (相当于) self::
。所以只需说 self instanceMethod
;没有理由说 self staticMethod
。 - ToolmakerSteve这是一个很晚的回复,但在之前的回答中补充了一些细节。
当涉及从同一类的另一个静态方法中调用PHP静态方法时,区分self
和类名非常重要。
以这段代码为例:
class static_test_class {
public static function test() {
echo "Original class\n";
}
public static function run($use_self) {
if($use_self) {
self::test();
} else {
$class = get_called_class();
$class::test();
}
}
}
class extended_static_test_class extends static_test_class {
public static function test() {
echo "Extended class\n";
}
}
extended_static_test_class::run(true);
extended_static_test_class::run(false);
这段代码的输出结果为:
原始类
扩展类
这是因为self
指的是代码所在的类,而不是调用它的类。
如果你想使用继承原始类的方法,你需要使用类似以下代码:
$class = get_called_class();
$class::function_name();
self::
会做什么?依我之见,在静态级别上要谨慎使用方法覆盖;将其限制在实例方法上看起来会更清晰。换句话说,你代码的读者期望实例方法被覆盖(这就是面向对象编程的本质),但不期望静态方法被覆盖。 - ToolmakerSteveself
是合理的。您已经声明了一个作为第一个类扩展的单独类。在扩展类中使用self
将引用扩展类。这并不与其他答案相矛盾,但它确实有助于说明self
的范围。 - iyrin在较新的PHP版本中,self::staticMethod();
也将不起作用。它会抛出严格标准错误。
在这种情况下,我们可以创建相同类的对象并通过对象调用。
以下是示例:
class Foo {
public function fun1() {
echo 'non-static';
}
public static function fun2() {
echo (new self)->fun1();
}
}
fun1
没有使用self
,那么将其作为实例方法并不合理。在php中正确的方法是声明public static function fun1
,然后通过指定类来调用:Foo::fun1
。我相信这是修复严格标准错误的预期方式。 - ToolmakerSteveclassName::staticFunctionName
范例
ClassName::staticMethod();