ホームページ  >  記事  >  バックエンド開発  >  PHP の self キーワードについて学ぶ

PHP の self キーワードについて学ぶ

青灯夜游
青灯夜游転載
2020-04-15 09:15:021996ブラウズ

この記事では主に、PHP の self キーワードに関する関連知識を紹介します。サンプルコードを交えて詳しく紹介しているので参考になると思いますので、困っている方は参考にしていただければ幸いです。

PHP の self キーワードについて学ぶ

序文

誰かが self キーワードの使用法について質問しましたが、答えは比較的明白です。 : 静的メンバー これを使用して関数内で非メンバー関数を呼び出すことはできませんが、self を使用して静的メンバー関数/変数/定数を呼び出すことはできます。他のメンバー関数は self を使用して静的メンバー関数および非静的メンバー関数を呼び出すことができます。議論が深まるにつれ、自分というものはそれほど単純なものではないことが分かります。このことを考慮して、この記事では、まずいくつかのキーワードを比較および区別し、次に self の使い方をまとめます。

親、静的、およびこれの違い

自己を完全に理解したい場合は、親、静的、および親について理解する必要があります。静的であり、これは区別されます。以下に比較を示します。

parent

self とparent の区別は比較的簡単です。parent は、親クラス/基本クラスの隠しメソッド (または変数) を指します。 self は Self メソッド (または変数) を指します。たとえば、コンストラクター内で親クラスのコンストラクターを呼び出します。

class Base {
 public function __construct() {
  echo "Base contructor!", PHP_EOL;
 }
}

class Child {
 public function __construct() {
  parent::__construct();
  echo "Child contructor!", PHP_EOL;
 }
}

new Child;
// 输出:
// Base contructor!
// Child contructor!

static

static は通常、関数または変数を変更してクラス関数にし、クラス変数。関数内の変数を変更して、そのライフ サイクルをアプリケーション全体のライフ サイクルに拡張することもできます。ただし、self との関連付けは、PHP 5.3 以降に導入された新しい用途である静的遅延バインディングです。

staticの静的遅延バインディング機能を使用すると、実行時に所属クラスを動的に決定することができます。例:

class Base {
 public function __construct() {
  echo "Base constructor!", PHP_EOL;
 }

 public static function getSelf() {
  return new self();
 }

 public static function getInstance() {
  return new static();
 }

 public function selfFoo() {
  return self::foo();
 }

 public function staticFoo() {
  return static::foo();
 }

 public function thisFoo() {
  return $this->foo();
 }

 public function foo() {
  echo "Base Foo!", PHP_EOL;
 }
}

class Child extends Base {
 public function __construct() {
  echo "Child constructor!", PHP_EOL;
 }

 public function foo() {
  echo "Child Foo!", PHP_EOL;
 }
}

$base = Child::getSelf();
$child = Child::getInstance();

$child->selfFoo();
$child->staticFoo();
$child->thisFoo();

プログラムの出力は次のとおりです:

Base コンストラクター!
Child コンストラクター!
Base Foo!
Child Foo!
Child Foo!

関数参照に関して、self と static の違いは次のとおりです: 静的メンバー関数の場合、self はコードの現在のクラスを指し、static は呼び出し元のクラスを指します。 class; 非静的メンバー関数の場合、ポリモーフィズムを自己抑制し、現在のクラスのメンバー関数を指し、静的はこれに相当し、動的は呼び出し側クラスの関数を指します。

parent、self、static という 3 つのキーワードは、組み合わせると非常に興味深いものになります。これらはそれぞれ、親クラス、現在のクラス、サブクラスを指し、少し「過去、現在、未来」を持っています。風味。

this

self と this は最もよく議論される組み合わせであり、最も悪用される可能性が高い組み合わせでもあります。 2 つの主な違いは次のとおりです:

  1. これは静的メンバー関数では使用できませんが、自身では使用できます;
  2. 静的メンバー関数/変数にアクセスするには、次の使用をお勧めします。 $ this:: または $this-> フォームの代わりに self;
  3. 非静的メンバー変数にアクセスするには、self は使用できません。this のみを使用します。
  4. this は、オブジェクトの作成時にインスタンス化する必要があります。 has been 以下で使用される場合、self にはこの制限はありません。
  5. は非静的メンバー関数内で使用され、多態性の動作を自己抑制し、現在のクラスの関数を参照します。また、これはオーバーライド関数を参照します。呼び出し側クラスの (通話がある場合)。

自己の目的

上記の 3 つのキーワードの違いを読んだ後、自己の目的はすぐに分かりますか?一文で要約すると、self は常に「現在のクラス (およびクラス インスタンス)」を指します。詳細は、次のとおりです:

  1. クラス名を置き換えて、現在のクラスの静的メンバー変数と静的関数を参照します;
  2. ポリモーフィックな動作を抑制し、クラスの関数を参照しますサブクラスではなく現在のクラス カバレッジの実装;

スロット

  1. これらのキーワードのうち、これだけが必要です$ 記号を追加する必要があります。強迫性障害は非常に不快であることを意味します;
  2. 静的メンバー関数は、$this-> を通じて非静的メンバー関数を呼び出すことはできませんが、self を通じて呼び出すことはできます。 :: と は呼び出し関数では使用されません $this-> を使用してもスムーズに実行できます。この動作は、PHP のバージョンによって動作が異なるようです。現在の 7.3 では問題ありません。
  3. 静的関数と非静的関数で self を出力します。結果はどうなるでしょうか?これらはすべて、謎の出力である string(4) "self" です;
  4. return $thisinstanceof static::class; 構文エラーはありますが、次の 2 つの書き方は正常です:
$class = static::class;
return $this instanceof $class;
// 或者这样:
return $this instanceof static;

それではなぜそうなるのですか? !

推奨学習: PHP ビデオ チュートリアル

以上がPHP の self キーワードについて学ぶの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjb51.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。