1

PHP が拡張クラスの静的メソッドを使用してメモリと変数を管理する方法を理解しようとしています。Model、User1、User2 という名前の 3 つのクラスがあります。したがって:

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 クラスを指し示しますか? それとも、new User1(); で各クラスを宣言するときに、個別のスコープを作成するだけですか? と new User2();?

ありがとう。

4

3 に答える 3

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
于 2012-07-14T18:12:24.783 に答える
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

于 2012-07-14T17:50:25.563 に答える
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 たとえば、それらは個別の値とインスタンスメソッドを持つインスタンスである必要があるように見えますが、それは凝縮された例が原因である可能性があります。

于 2012-07-14T17:57:33.143 に答える