ホームページ  >  記事  >  バックエンド開発  >  PHP の self キーワードを数分で取得します

PHP の self キーワードを数分で取得します

silencement
silencement転載
2020-01-22 00:47:551835ブラウズ

PHP の self キーワードを数分で取得します

これを使用して静的メンバー関数内の非メンバー関数を呼び出すことはできませんが、self を使用して静的メンバー関数/変数/定数を呼び出すことはできます。

その他メンバー関数は、self 静的メンバー関数および非静的メンバー関数を使用して呼び出すことができます。

議論が深まるにつれて、自分というものはそれほど単純なものではないことが分かりました。このことを考慮して、この記事では、まずいくつかのキーワードを比較および区別し、次に self の使い方をまとめます。

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

自己を完全に理解したい場合は、親、静的、およびこれを区別する必要があります。

これを使用して静的メンバー関数内の非メンバー関数を呼び出すことはできませんが、self を使用して静的メンバー関数/変数/定数を呼び出すことはできます。

他のメンバー関数は 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

静的の一般的な目的は、関数または変数を変更してクラス関数およびクラス変数にすることです。また、関数内の変数を変更してライフサイクルを拡張することもできます。アプリケーション全体のライフサイクル。

しかし、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 constructor!
Child constructor!
Base Foo!
Child Foo!
Child Foo!

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

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

this

self と this は最もよく議論される組み合わせであり、最も誤用される可能性が高い組み合わせでもあります。

この 2 つの主な違いは次のとおりです:

これは静的メンバー関数では使用できませんが、自身では使用できます;

静的メンバー関数の場合/variables アクセスするには、$this:: または $this-> の代わりに self を使用することをお勧めします。;

非静的メンバー変数へのアクセスには、self は使用できません。this のみを使用します。;

これはオブジェクトがインスタンス化されている場合に使用する必要があり、self にはこの制限はありません。

は非静的メンバー関数で使用され、self はポリモーフィックな動作を抑制し、現在のクラスの関数を参照します。これは呼び出し側クラスの重い関数を参照しますが、関数 (存在する場合) をオーバーライドします。

自己の目的

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

詳細:

クラス名を置換し、現在のクラスの静的メンバー変数と静的関数を参照します。

多態性の動作を抑制し、クラスの関数を参照します。サブクラスでオーバーライドされた実装ではなく、現在のクラス;

スロット

这几个关键字中,只有this要加$符号且必须加,强迫症表示很难受;

静态成员函数中不能通过$this->调用非静态成员函数,但是可以通过self::调用,且在调用函数中未使用$this->的情况下还能顺畅运行。此行为貌似在不同PHP版本中表现不同,在当前的7.3中ok;

在静态函数和非静态函数中输出self,猜猜结果是什么?都是string(4) "self",迷之输出;

return $this instanceof static::class;会有语法错误,但是以下两种写法就正常:

$class = static::class;
return $this instanceof $class;
// 或者这样:
return $this instanceof static;

所以这是为什么啊?!

$class = static::class;

return $this instanceof $class;

// 或者这样:

return $this instanceof static;

以上就是解析PHP的self关键字的详细内容。

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

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