<?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();
答案 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方式实现你想要的东西。