8
<?php
    class Stat
    {
        public $var1='H';
        public static $staticVar = 'Static var';


        static function check()
        {

            echo $this->var1;               
            echo "<br />".self::$staticVar ."<br />";
            self::$staticVar = 'Changed Static';
            echo self::$staticVar."<br />";
        }
        function check2()
        {
            Stat::check();
            echo $this->var1;           
            echo "b";
        }
    }

?>

我可以这样用吗

$a = new Stat();
$a->check2();
4

4 回答 4

10

不,静态方法将无法访问$this(因为在静态上下文中没有$this可讨论的内容)。

如果您需要在静态方法中引用当前对象,则它不是静态方法。但是,您可以从非静态方法访问静态属性和函数。

于 2013-01-16T10:14:26.580 回答
5

正如其他答案所说,您不能在静态方法中使用实例方法。但是,您可以将静态属性存储为实例数组。使用这样的一些代码:

private static $_instances = array();

public function __construct() {
    self::$_instances[] = $this;
}

这样,您可以在静态方法中调用所有实例上的方法。使用这样的一些代码:

public static effItAll() {
    foreach (self::$_instances as $instance) {
        $instance->instanceMethod();
    }
}

或者您也可以只存储最后一个实例。或某些实例取决于参数。无论如何,您可以将任何实例存储在静态属性中,从而能够在您的静态方法中调用该实例。

于 2013-01-16T10:19:11.990 回答
0

你就是不能。$this解释很简单:在静态方法上下文中无法访问。你必须找到另一种设计来实现你想要的:-)

于 2013-01-16T10:14:54.120 回答
0

不可以。静态方法和实例对象不能以这种方式一起工作。但是,您可以将实例对象的引用传递给静态方法:

static function check(&$classReference) //Adding class reference to function
{

    echo $classReference->var1;               
    echo "<br />".self::$staticVar ."<br />";
    self::$staticVar = 'Changed Static';
    echo self::$staticVar."<br />";
}
function check2()
{
    Stat::check($this); //Passing $this
    echo $this->var1;           
    echo "b";
}

然而,仅仅因为它是可能的并不意味着它应该被完成。可能还有另一种方法可以以更好的 OOP 方式实现您想要的。

于 2013-01-16T10:19:18.923 回答