ホームページ >バックエンド開発 >PHPチュートリアル >PHP OOP 部分 - 静的プロパティ、メソッド、および this と self

PHP OOP 部分 - 静的プロパティ、メソッド、および this と self

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-04 16:36:41679ブラウズ

PHP OOP Part-Static property, method and this vs self

このシリーズでは、PHP オブジェクト指向プログラミング (OOP) の基礎について説明します。コンテンツは連続したパートに編成され、それぞれが特定のトピックに焦点を当てます。初心者または OOP の概念に慣れていない場合、このシリーズは段階的にガイドできるように設計されています。 このパートでは、PHP の静的プロパティ、メソッド、this と self について説明します。一緒に PHP OOP を学ぶ旅を始めましょう!

プロパティとメソッドとは何ですか?

まず、プロパティとメソッドを理解しましょう。クラスを使用して複数のオブジェクトを作成すると、各オブジェクトに個別のメモリ位置が割り当てられます。その結果、そのオブジェクトのすべてのプロパティとメソッドも、その特定のメモリ位置に割り当てられます。

これは、オブジェクトのプロパティを変更する場合、変更はその特定のオブジェクトのみに制限されることを意味します。クラスのプロパティとメソッドはそのクラスのそれぞれのオブジェクトに関連付けられているため、他のオブジェクトには影響しません。

クラスの外部からこれらのプロパティまたはメソッドにアクセスするには、そのクラスのオブジェクトを作成する必要があります。ただし、クラス内のこれらのプロパティまたはメソッドにアクセスしたい場合は、$this キーワードを使用できます。 $this キーワードは、クラスの現在のオブジェクトを表します。 $this キーワードについては後ほど詳しく説明します。次の例を見てみましょう:

コード例

class Car
{
   public $name;
   public $color;

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

   public function getValue()
   {
      echo "Car name: $this->name\n";
      echo "Car color: $this->color\n";
   }
}

$tesla = new Car('Zip', 'Blue');
$tesla->getValue();

この例では、クラスのプロパティにアクセスするために、同じクラスのメソッド内で $this キーワードを使用していることがわかります。同様に、このクラスのメソッドを外部から使用するには、クラスのオブジェクトを作成します。これは、通常、クラスの通常のプロパティまたはメソッドを使用する方法です。

静的プロパティと静的メソッドとは何ですか?

ただし、静的プロパティまたは静的メソッドの動作は異なります。クラスを定義すると、クラスにメモリ位置が 1 回だけ割り当てられます。同様に、クラスで静的プロパティまたはメソッドを定義すると、それらもクラス自体と一緒に特定のメモリの場所に割り当てられますが、割り当てられるのは 1 回だけです。

その結果、後で静的プロパティまたはメソッドを変更すると、その変更はクラスのすべてのインスタンスに反映されます。言い換えれば、静的プロパティまたはメソッドが使用される場合はどこでも、その更新された値が利用可能になります。

クラスの外部から静的プロパティまたはメソッドにアクセスしたい場合は、オブジェクトを作成せずに :: (スコープ解決演算子) を使用できます。あるいは、オブジェクトを作成した後にアクセスすることもできます。クラス内からそれらにアクセスするには、self キーワードまたはクラス名自体を使用できます。ここで、self キーワードはクラスを表します。

self キーワードについては後ほど詳しく説明します。次の例を見てみましょう:

コード例

class Car
{
   public $name;
   public $color;

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

   public function getValue()
   {
      echo "Car name: $this->name\n";
      echo "Car color: $this->color\n";
   }
}

$tesla = new Car('Zip', 'Blue');
$tesla->getValue();

この例では、クラスの静的プロパティにアクセスするために、同じクラスのメソッド内で self キーワードを使用していることがわかります。さらに、クラスの外から静的メソッドを使用するために、クラスのオブジェクトを作成しました。ただし、オブジェクトを作成せずに、クラス名と :: (スコープ解決演算子) を使用して直接アクセスすることもできます。これは、クラスの静的プロパティまたはメソッドを通常使用する方法です。

上記の例では、Car クラスを使用して、異なるデータを持つ 2 つのオブジェクト $toyota と $bmw を作成したことがわかります。次に、これらのオブジェクトの値にアクセスしたいと思います。上記のコードを実行すると、次の出力が表示されます:

コード例

class Car
{
   public static $name;
   public static $color;

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

   public static function getValue()
   {
      echo "Car name: " . self::$name . "\n";
      echo "Car color: " . self::$color . "\n";
   }
}

$toyota = new Car('Toyota', 'Black');
$bmw = new Car('BMW', 'Orange');

$toyota::getValue();
$bmw::getValue();

Car::getValue();

両方のオブジェクトが同じ値を示していることがわかります。つまり、取得している値は、最後に作成されたオブジェクトからのものです。クラスを通じて値に直接アクセスしようとしても、同じ値、つまり 2 番目のオブジェクトの値が取得されます。

その理由は非常に明らかです。前述したように、静的プロパティまたは静的メソッドは単一のメモリ場所に作成されます。静的プロパティまたは静的メソッドがどこからでも変更されると、その変更はクラスのすべてのインスタンスに影響します。

上記の例では、2 番目のオブジェクトを作成すると、オブジェクトが作成されるとすぐにプロパティの値が変更されました。この変更は、クラスのすべてのオブジェクトが同じ静的プロパティまたはメソッドを共有するため、以前に作成されたオブジェクトにも影響を与えました。

クラスの静的プロパティまたはメソッドは、通常のクラスのプロパティまたはメソッドと同じ方法では使用できないことに留意することが重要です。 → 演算子を使用してアクセスすることはできません。代わりに、クラスの内部または外部からアクセスするかどうかに関係なく、::(スコープ解決演算子) を使用する必要があります。

$this と self キーワードの比較

$this とは何ですか?

$this キーワードと self キーワードの使用法についてはすでに説明しました。ここで、これらの概念をより深く理解するために、さらに深く掘り下げてみましょう。

$this は組み込みの PHP キーワードです。クラスを使用して 1 つ以上のオブジェクトを作成すると、クラス内で定義された通常のプロパティとメソッドには、クラス内から $this キーワードを使用してアクセスできます。

これで、クラスが定義されると、そのクラスが特定のメモリ位置に 1 回だけ割り当てられることがわかりました。このクラスから複数のオブジェクトを作成する場合、$this キーワードはすべてのオブジェクトに対して 1 回だけプロパティまたはメソッドにアクセスするのでしょうか?

答えは「いいえ」です。これは、すでに説明したように、$this キーワードはクラス自体ではなく、そのクラスによって作成されたオブジェクトを表すためです。言い換えれば、$this はオブジェクトに直接関係しています。その結果、作成されたすべてのオブジェクトについて、$this キーワードはオブジェクトごとにクラスのプロパティとメソッドに個別にアクセスします。次の例を見てみましょう:

class Car
{
   public $name;
   public $color;

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

   public function getValue()
   {
      echo "Car name: $this->name\n";
      echo "Car color: $this->color\n";
   }
}

$tesla = new Car('Zip', 'Blue');
$tesla->getValue();

前の例では、$this を複数回使用しましたが、$this の使用法については詳しく説明していませんでした。 $this についてある程度理解できたので、その使用方法をさらに理解できるようになります。このクラスを使用してオブジェクトを作成しました。これで、$this キーワードがオブジェクトごとに個別にプロパティにアクセスすることがわかりました。

ただし、$this キーワードは静的メソッド内では使用できないことに注意することが重要です。使用できない理由は後ほど説明します。

セルフキーワードとは何ですか?

クラスが定義されるとき、そのクラスはメモリ位置に 1 回だけ割り当てられることはすでにわかっています。同様に、そのクラス内のすべての静的プロパティとメソッドも、クラスとともにメモリの場所に 1 回だけ割り当てられます。

その結果、このクラスを使用してオブジェクトを作成する場合、静的プロパティや静的メソッドはオブジェクトごとに個別に作成されません。このため、$this キーワードを使用してこれらの静的プロパティやメソッドにアクセスすることはできません。 $this キーワードはクラスのオブジェクトを表し、静的プロパティやメソッドはオブジェクトには関係せず、クラス自体に直接関連付けられるため、$this を使用してアクセスすることはできません。

クラス内の静的プロパティまたはメソッドにアクセスするには、self キーワードまたはクラス名を ::(スコープ解決演算子) とともに使用します。これは、self キーワードがクラス自体を表すためです。次の例を見てみましょう:

class Car
{
   public static $name;
   public static $color;

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

   public static function getValue()
   {
      echo "Car name: " . self::$name . "\n";
      echo "Car color: " . self::$color . "\n";
   }
}

$toyota = new Car('Toyota', 'Black');
$bmw = new Car('BMW', 'Orange');

$toyota::getValue();
$bmw::getValue();

Car::getValue();

この例では、クラス名または ::scope 解決演算子を含む self キーワードを使用して、非静的メソッド内の静的メンバーに簡単にアクセスできることがわかります。これらはクラスに関連しているためです。したがって、それらにアクセスするために別のオブジェクトを作成する必要はありません。

ただし、静的メソッド内の非静的メンバーにアクセスしたい場合は、$this キーワードを使用する必要があります。ただし、$this キーワードは静的メソッド内では使用できないことがわかっています。これは、$this がオブジェクトに関連しているのに対し、非静的メンバーはオブジェクトに関連していないためです。これが、静的メソッド内で $this キーワードを使用できない理由です。

ただし、静的メソッド内の非静的メンバーにアクセスする必要がある場合は、上記の例に示すように、静的メソッド内でクラスのインスタンスまたはオブジェクトを作成し、$this キーワードを使用してそれらにアクセスできます。 .

これにより、$this キーワードと self キーワードの使用法がより明確に理解できるようになることを願っています。今日はここまでです。次のレッスンに進みます。

GitHub や Linkedin で私とつながることができます。

以上がPHP OOP 部分 - 静的プロパティ、メソッド、および this と selfの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。