静态函数可以在php中访问非静态变量吗?

时间:2013-01-16 10:11:06

标签: php static-variables

<?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 个答案:

答案 0 :(得分:10)

没有。静态方法无法访问$this(因为在静态上下文中没有$this可以讨论)。

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

答案 1 :(得分:4)

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

private static $_instances = array();

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

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

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

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

答案 2 :(得分:0)

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

答案 3 :(得分: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方式实现你想要的东西。