2013-01-16 44 views
2
<?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"; 
     } 
    } 

?> 

我可以用它这样静态函数可以在php中访问非静态变量吗?

$a = new Stat(); 
$a->check2(); 
+1

一个静态方法将如何知道它应该访问访问非静态属性的对象的实例?简单回答是不”。更详细的答案是,它应该发出一个错误“在静态上下文中使用$ this” –

+0

如果它可以_can_,那么PHP比我想象的更加复杂。只有_instance method_应该能够访问_instance_变量。 – Alnitak

+1

我相信这会引发错误。因为您无法从静态方法访问非静态属性。在C#中,你可以使属性为静态,并从静态方法访问静态属性,但正如我记得我不相信你可以在PHP中做到这一点?但我很高兴能够纠正这一点。 –

回答

9

号静态方法将无法获得$this(因为没有$this谈论在静态情况下)。

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

0

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

+0

你可以做一个 $ instance = new self(); ,这样你可以调用非静态变量,它违背了静态元素的目的,但你可以做到这一点哈哈 –

2

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

private static $_instances = array(); 

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

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

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

或者你也可以只存储最后一个实例。或者取决于参数的某个实例。无论如何,您只需将任何实例存储在静态属性中,然后就可以在静态方法中调用此实例。

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"; 
} 

然而,只是因为它可能并不意味着它应该做的事。可能有另一种方法可以以更好的面向对象的方式实现你想要的东西。