如何从静态方法中访问属性?

3

这是我的代码:

class {
    $property = "something";
    public static function myfunc() {
         return $this->property;
    }
}

但是PHP会抛出以下错误:

在非对象上下文中使用$this

我知道,问题出在静态方法中使用了$this->,好的,我会将其移除,像这样:

class {
    $property = "something";
    public static function myfunc() {
         return self::property;
    }
}

但是遗憾的是,PHP 抛出了以下错误:

未定义类常量 'property'

我该如何在一个静态方法之外访问属性?


5
如果你想访问实例属性,那么只能从实例方法访问,无法从静态方法中访问;如果你的方法需要访问实例属性,为什么要将它定义为静态方法呢?请注意,静态方法只能访问静态属性或类常量。 - Mark Baker
@KhorneHoly 谢谢,已编辑; - Martin AJ
@MarkBaker 因为我需要在不创建其类对象的情况下随处调用该方法。 - Martin AJ
1
如果不想实例化该类,则不要将其设置为实例属性,而应该设置为静态属性。参考链接:http://www.php.net/manual/en/language.oop5.static.php#language.oop5.static.properties - Mark Baker
2
@sg- 我是那些“白痴”之一。你在那个答案中没有解释任何东西,只是尽可能地用最少的努力来赚取一些简单的声望。你的代码是正确的,但我认为你的回答很糟糕。 - KhorneHoly
可能是 从静态方法访问非静态属性 的重复问题。 - user2544565
2个回答

7

一般来说,你不应该这么做。静态方法之所以不能访问实例字段是有原因的。尽管如此,你可以像这样做:

// define a static variable
private static $instance;

// somewhere in the constructor probably
self::$instance = $this;

// somewhere in your static method
self::$instance->methodToCall();

请注意,它仅适用于类的单个实例,因为静态变量在所有实例之间共享(如果有的话)。
您还需要添加一堆验证(例如$instance是否为null),并注意所有可能会给您带来麻烦的实现细节。
无论如何,我不建议使用此方法。请自行承担风险。

2

解释

如果你想在一个不需要实例化的类中使用一个不会改变的变量,你需要使用 static 关键字,以便在后面的方法中访问它。

此外,你需要为你的类命名。

最后,如果你没有指定 protectedpublic 关键字,你的变量可能会在类外部被访问,这样方法就没有意义了。所以我假设你需要一个 protected 值来使用该方法调用该变量。

源代码

class Foo {

    protected static $property = 'something';

    public function getProperty() {

        return self::$property;

    }

}

echo Foo::getProperty(); /* will display : something */
echo Foo::$property; /* change from protected to public to use that syntax */

文档

PHP:类

PHP:静态

PHP:可见性


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接