扩展类和静态值

时间:2012-07-14 17:23:28

标签: php inheritance static

我试图了解PHP如何使用扩展类中的静态方法管理内存和变量。我有三个名为Model,User1,User2的课程。因此:

class Model {
    static public $structure;
    static public $name;
    static function get_structure() {
        return self::$structure = file_get_contents(self::$name.'.json');
    }
}
class User1 extends Model {

}
class User2 extends Model {

}
User1::$name = 'User1';
User2::$name = 'User2';
echo User1::get_structure();
echo User2::get_structure();

如果我运行User1 :: get_structure();由于某种原因,它没有相应地填充结果,它似乎抓住了User2的值(声明的最后一个$ name值)。

我的假设是声明User2和扩展Model为我的$ name属性创建了一个完全独立的范围。因此,User1和User2被声明为具有与Model相同结构的单独类。然后我可以在不同的范围内静态定义它们的值。

我现在正在质疑这一点。如果我扩展并调用相同的$ name变量,它们是否都指向Model类?或者,当我用新的User1()声明每个类时,它是否只创建一个单独的作用域;和新的User2();?

感谢。

3 个答案:

答案 0 :(得分:1)

您会收到此行为,因为您正在访问相同的变量

class X
{
    public static $data = null;
}

class Foo extends X{};
class Bar extends X{};

Foo::$data = 'lorem ipsum';
echo Bar::$data;
// :: output :: lorem ipsum;

即使在继承的类中,您的$name变量仍然与Model类绑定。

答案 1 :(得分:1)

是的,所有扩展模型的类都将指向同一个$ name变量。 将静态变量看作“全局”变量。

也许这个例子会澄清你:

class Model 
{
    static public $name;
}

class User1 extends Model 
{
    public function setName( $name )
    {
        parent::$name = $name;
    }

    public function getName()
    {
        return parent::$name;
    }
}

class User2 extends Model 
{
    public function setName( $name )
    {
        parent::$name = $name;
    }

    public function getName()
    {
        return parent::$name;
    }
}

$user1 = new User1();
$user1->setName("User1");

$user2 = new User2();
$user1->setName("User2");

echo $user1->getName();
echo $user2->getName();

// Output : User2User2

答案 2 :(得分:0)

您可以使用以下方法解决问题:

<?php
class Model {
    static public $structure;
    static public $name;
    static function get_structure() {
        $class = get_called_class();
        return $class::$structure = file_get_contents($class::$name.'.json');
    }
}
class User1 extends Model {
    static public $structure;
    static public $name;
}
class User2 extends Model {
    static public $structure;
    static public $name;
}
User1::$name = 'User1';
User2::$name = 'User2';
echo User1::get_structure();
echo User2::get_structure();

...但是,您可能会问自己这个设计是否合适的问题。例如,atm它看起来应该是具有单独值的实例。实例方法,但可能是因为压缩的例子。