4

$ thisを使用して、現在のオブジェクトを参照します。現在のクラスを参照するには、selfを使用します。つまり、非静的メンバーには$ this-> memberを使用し、静的メンバーにはself ::$memberを使用します。

http://board.phpbuilder.com/showthread.php?10354489-RESOLVED-php-class-quot-this-quot-or-quot-self-quot-keyword

class Demo
{
    private static $name;
    private $age;

    public function __construct($name, $age) 
    {
        self::$name = $name;
        $this->age=$age;
    }   

    public function show()
    {       
        echo "Name : ", self::$name, "<br/>";   //Accessing by self
        echo "Name : ", Demo::$name, "<br/>";   //Accessing by class name 
        echo "Age  : ", $this->age, "<br/>";    
    } 
}

$demo = new Demo("Tiny", 13);
$demo->show();

これにより、次の出力が生成されます。

Name : Tiny
Name : Tiny
Age : 13

前のスニペットself::$nameとの違いは何ですか?Demo::$name


class Person1
{
    private $name;
    private $address;

    public function __construct($name,$address)
    {
        $this->name = $name;
        $this->address = $address;
    }

    public function show()
    {
        echo "Name    : ", $this->name, "<br/>";    
        echo "Address : ", $this->address, "<br/>";  //Accessing by this
    }
}

$p1=new Person1("xxx", "yyy");
$p1->show();

class Person2
{
    private $name;
    private $address;

    public function __construct($name,$address)
    {
        self::$name = $name;
        self::$address = $address;
    }

    public function show()
    {
        echo "Name    : ", self::$name, "<br/>";    
        echo "Address : ", self::$address, "<br/>"; //Accessing by self 
    }
}

$p2=new Person1("xxx", "yyy");
$p2->show();

2つのクラスの前に、次のように同じ出力を生成しますPerson1Person2

Name : xxx
Address : yyy

Preson1(クラス、show()メソッドのように)の違いは何ですか

$this->name;
$this->address;

および(Preson2クラスの場合と同様に、show()メソッド)

self::$name;
self::$address;

この文脈では

4

2 に答える 2

2

クラス内での使用Demo::$nameとクラスself::$name内からの使用Demoは、事実上同じです。たとえば、クラスの名前を使用して別のクラスからパブリック静的変数にアクセスできるのと同じように、変数が静的でアクセス可能であるため、名前でアクセスできます。

したがって、その場合、名前によるアクセスは、ほとんどの場合、アクセス可能なクラスから任意のパブリック静的変数にアクセスできることの副産物にすぎません。

Person12番目の出力は、オブジェクトではなく新しいオブジェクトを作成しているように見えるため、最初の出力と同じように生成されPerson2ます(:を参照$p2=new Person1("xxx", "yyy");) 。

オブジェクトを作成するPerson2場合、宣言されていない静的変数に値を割り当てることができないため、エラーが発生します(オブジェクトレベルの変数はとにnameありますaddressが、静的ではありません)。それらをとして宣言した場合、静的呼び出しを使用しているためstatic、変更されたメソッドから同じ出力が得られます。show

オブジェクト(読み取り:インスタンス)変数と静的変数の違いがわからない場合は、グーグルに参加することをお勧めしますが、基本的に静的変数はオブジェクトレベルではなくクラスレベルに存在し、アクセス可能です指定されたタイプの任意のクラスメソッドまたはオブジェクトから(たとえば、100個のインスタンスがある場合、それらはすべて同じPerson2変数にアクセスできます)、インスタンス変数は個々のオブジェクト自体に固有です。 name

于 2012-07-23T17:39:59.907 に答える
1

最初の例self::$nameでは、クラスDemo::$name内で使用した場合、実質的に同じです。Demo

2番目の例では、静的プロパティとプロパティを宣言しておらず、それらにアクセスしているため、エラーが発生するはず$nameです$addressPerson1あなたが(おそらく意図せずに)のインスタンスを作成しているので、それはあなたの場合に機能します:

$p2=new Person1("xxx", "yyy");
于 2012-07-23T17:52:11.337 に答える