変数$ thisはPHPで何を意味しますか?


103

私は$this常にPHPで変数を参照しており、それが何に使用されるのかわかりません。個人的に使ったことはありません。

変数$thisがPHPでどのように機能するかを誰かに教えてもらえますか?

回答:


130

現在のオブジェクトへの参照であり、オブジェクト指向のコードで最も一般的に使用されます。

例:

<?php
class Person {
    public $name;

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

$jack = new Person('Jack');
echo $jack->name;

これは、作成されたオブジェクトのプロパティとして 'Jack'文字列を格納します。


1
同様のサンプルコードをKillerPHP OOPチュートリアルで見た:) killerphp.com/tutorials/php-objects-page-1
エドソン

素敵で簡単な説明。@meder omuraliev
パイ

40

$thisPHPで変数について学ぶ最良の方法は、さまざまなコンテキストでインタープリターに対してそれを試すことです:

print isset($this);              //true,   $this exists
print gettype($this);            //Object, $this is an object 
print is_array($this);           //false,  $this isn't an array
print get_object_vars($this);    //true,   $this's variables are an array
print is_object($this);          //true,   $this is still an object
print get_class($this);          //YourProject\YourFile\YourClass
print get_parent_class($this);   //YourBundle\YourStuff\YourParentClass
print gettype($this->container); //object
print_r($this);                  //delicious data dump of $this
print $this->yourvariable        //access $this variable with ->

したがって、$this疑似変数にはCurrent Objectのメソッドとプロパティがあります。このようなことは、クラス内のすべてのメンバー変数とメンバーメソッドにアクセスできるので便利です。例えば:

Class Dog{
    public $my_member_variable;                             //member variable

    function normal_method_inside_Dog() {                   //member method

        //Assign data to member variable from inside the member method
        $this->my_member_variable = "whatever";

        //Get data from member variable from inside the member method.
        print $this->my_member_variable;
    }
}

$thisObject変数の配列を含む、インタプリタによって作成されたPHPへの参照です。

$this通常のクラスの通常のメソッド内で呼び出す$thisと、そのメソッドが属するオブジェクト(クラス)が返されます。

$thisコンテキストに親オブジェクトがない場合は、未定義になる可能性があります。

php.netには、PHPオブジェクト指向プログラミングと$this、コンテキストに応じてどのように動作するかを説明する大きなページがあります。 https://www.php.net/manual/en/language.oop5.basic.php


素晴らしい説明。$ thisを、現在のクラスのプロパティへのアクセスに役立つ疑似オブジェクト/変数として扱うことができることを追加したいだけです。
S.Alvi

17

私はその古い質問を知っています、とにかく$ thisについて別の正確な説明。$ thisは主にクラスのプロパティを参照するために使用されます。

例:

Class A
{
   public $myname;    //this is a member variable of this class

function callme() {
    $myname = 'function variable';
    $this->myname = 'Member variable';
    echo $myname;                  //prints function variable
    echo $this->myname;              //prints member variable
   }
}

出力:

function variable

member variable

9

これは、他の多くのオブジェクト指向言語と同じように、それ自体からクラスのインスタンスを参照する方法です。

PHPドキュメントから:

疑似変数$ thisは、メソッドがオブジェクトコンテキスト内から呼び出されたときに使用できます。$ thisは呼び出し側オブジェクト(通常はメソッドが属するオブジェクトですが、メソッドが2次オブジェクトのコンテキストから静的に呼び出された場合は別のオブジェクト)への参照です。


7

$ thisを使用せず、次のコードスニペットを使用して同じ名前のインスタンス変数とコンストラクター引数を作成しようとするとどうなるかを見てみましょう

<?php

class Student {
    public $name;

    function __construct( $name ) {
        $name = $name;
    }
};

$tom = new Student('Tom');
echo $tom->name;

?>

それは何も反響しません

<?php

class Student {
    public $name;

    function __construct( $name ) {
        $this->name = $name; // Using 'this' to access the student's name
    }
};

$tom = new Student('Tom');
echo $tom->name;

?>

これは「トム」をエコーし​​ます


2
コードスニペットは両方ともまったく同じか、何か不足していますか?
Demento 2016年

@Demento:はい。$this2番目のコンストラクターを使用して修正しました。
アクセルギルミン2016年

name = $ nameで生徒の名前にアクセスできない理由を説明してもらえますか?それは私には意味がありません。
マルコFloriano

マリオ、それはスコープのせいです。関数の内部$nameはトムですが、関数の範囲は関数のスコープに制限されているため、関数の外部には値がありません。
dearsina

4

クラスを作成するとき、(多くの場合)インスタンス変数とメソッド(別名関数)があります。$ thisはこれらのインスタンス変数にアクセスするため、関数はこれらの変数を取得し、必要なことを実行して、必要なことを実行できます。

mederの例の別のバージョン:

class Person {

    protected $name;  //can't be accessed from outside the class

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

    public function getName() {
        return $this->name;
    }
}
// this line creates an instance of the class Person setting "Jack" as $name.  
// __construct() gets executed when you declare it within the class.
$jack = new Person("Jack"); 

echo $jack->getName();

Output:

Jack


2

$ thisは特別な変数であり、同じオブジェクトを参照します。自体。

実際には現在のクラスのインスタンスを参照します

上記のステートメントをクリアする例を以下に示します

<?php
 class Books {
  /* Member variables */
  var $price;
  var $title;

  /* Member functions */
  function setPrice($par){
     $this->price = $par;
  }

  function getPrice(){
     echo $this->price ."<br/>";
  }

  function setTitle($par){
     $this->title = $par;
  }

  function getTitle(){
     echo $this->title ." <br/>";
  }
}
?> 

もう少し詳しく説明してください
Neeraj Rathod

2

これは長い詳細な説明です。これが初心者に役立つことを願っています。とても簡単にします。

まず、クラスを作成しましょう

<?php 

class Class1
{
    
}

?>phpコードのみを使用している場合は、php終了タグを省略できます。

次に、プロパティとメソッドを内に追加しますClass1

<?php 

class Class1
{
    public $property1 = "I am property 1";
    public $property2 = "I am property 2";

    public function Method1()
    {
        return "I am Method 1";
    }
}

プロパティは単純な変数ですが、クラス内でプロパティにcuzという名前を付けています。

メソッドは単純な関数ですが、メソッドcuzもクラス内にあります。

publicメソッドまたはプロパティはどこにでもスクリプトでアクセスすることができることを意味するキーワード。

ここで、内部でプロパティとメソッドを使用する方法 Class1か?

答えは、インスタンスまたはオブジェクトを作成することです。オブジェクトをクラスのコピーと考えてください。

<?php 

class Class1
{
    public $property1 = "I am property 1";
    public $property2 = "I am property 2";

    public function Method1()
    {
        return "I am Method 1";
    }
}

$object1 = new Class1;
var_dump($object1);

すべてのコンテンツを$object1含むのコピーであるオブジェクトを作成しましたClass1。そして、の$object1使用内容をすべてダンプしましたvar_dump()

これはあなたに与えるでしょう

object(Class1)#1 (2) { ["property1"]=> string(15) "I am property 1" ["property2"]=> string(15) "I am property 2" }

オブジェクトのダンプ中にメソッドが表示されない理由を除いて、すべての内容はにClass1あります。$object1Method1

次に、アクセス$property1のみを行う場合はどうでしょうか。その単純な、私たちはvar_dump($object1->property1);、私たちは追加しました->property1、私たちはそれを指摘しました。

アクセスもできMethod1()ますvar_dump($object1->Method1());

ここで$property1、内部からアクセスしたいMethod1()とします。これを行います

<?php 

class Class1
{
    public $property1 = "I am property 1";
    public $property2 = "I am property 2";

    public function Method1()
    {   
        $object2 = new Class1;
        return $object2->property1;
    }
}

$object1 = new Class1;
var_dump($object1->Method1()); 

$object2 = new Class1;新しいコピーでClass1あるインスタンスを作成したか、インスタンスと言うことができます。次にproperty1$object2

return $object2->property1;

これはstring(15) "I am property 1"ブラウザで印刷されます。

これを内部で行う代わりに Method1()

$object2 = new Class1;
return $object2->property1;

これをします

return $this->property1;

$thisオブジェクトは、クラス自体を参照するためにクラス内で使用されています。

新しいオブジェクトを作成し、それをこのように返すための代替手段です

$object2 = new Class1;
return $object2->property1;

もう一つの例

<?php 

class Class1
{
    public $property1 = 119;
    public $property2 = 666;
    public $result;

    public function Method1()
    {   
        $this->result = $this->property1 + $this->property2;
        return $this->result;
    }
}

$object1 = new Class1;
var_dump($object1->Method1());

整数を含む2つのプロパティを作成し、それらを追加して結果をに入れました$this->result

その事を忘れるな

$this->property1= $property1=119

それらは同じ値を持っています.. etc

これで説明がつくといいのですが。

この一連のビデオは、OOPで大いに役立ちます

https://www.youtube.com/playlist?list=PLe30vg_FG4OSEHH6bRF8FrA7wmoAMUZLv


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.