ホームページ > PHPフレームワーク > Laravel > Laravelでのselfの使用法は何ですか

Laravelでのselfの使用法は何ですか

WBOY
リリース: 2022-02-18 11:50:37
オリジナル
2771 人が閲覧しました

laravel では、self キーワードはクラス名を置き換えるために使用されます。これは、現在のクラスの静的メンバー変数と静的関数を参照できます。多態性の動作を抑制するためにも使用されます。次の関数を参照できます。サブクラスではなく現在のクラス。オーバーライドされた実装では、self は常に現在のクラスとクラス インスタンスを指します。

Laravelでのselfの使用法は何ですか

#この記事の動作環境: Windows 10 システム、Laravel バージョン 6、Dell G3 コンピューター。

laravel での self の使用法とは何ですか

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

parentstaticthis

の違い self# を完全に理解したい場合# # は、 parentstatic および this とは区別する必要があります。以下に比較を示します。

parent

selfparent の区別は比較的簡単です。parent は、親クラス/ 基本クラスの隠しメソッド (または変数)、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 constructor!
Child constructor!
Base Foo!
Child Foo!
Child Foo!
ログイン後にコピー

関数参照の観点から見ると、

selfstatic の違いは次のとおりです。静的メンバー関数の場合、self はコードの現在のクラスを指し、static は呼び出しクラスを指します。非静的メンバー関数の場合、self はポリモーフィズムを抑制します。 static は現在のクラスのメンバー関数を指します。 staticthis

と同等で、呼び出し側クラスの関数を動的に指します。 3 つのキーワード

parentselfstatic

は、親クラス、現在のクラス、とサブクラスはそれぞれ、「過去、現在、未来」に似ています。

this

selfthis

は最も議論され、悪用される可能性が最も高い組み合わせです。 2 つの主な違いは次のとおりです:
  1. this は静的メンバー関数では使用できませんが、self
  2. は使用できます。静的メンバー関数 / 変数アクセスの場合、
  3. $this:: または $this->; ## の代わりに self を使用することをお勧めします。 # ではありません 静的メンバー変数にアクセスするには、
  4. self
  5. は使用できません。this のみです。オブジェクトが既に作成されている場合は、
  6. this
  7. を使用する必要があります。 、self にはこの制限はありません。 は非静的メンバー関数内で使用され、
  8. self
  9. はポリモーフィックな動作を抑制し、現在の関数を参照します。 class; および this 呼び出しクラス (存在する場合) のオーバーライド関数を参照します。
self

の目的 上記 3 つのキーワードの違いを読んだ後、

self

の目的はすぐにわかりますか? ?一文で要約すると、self は常に「現在のクラス (およびクラス インスタンス)」を指します。詳細は次のとおりです: <ol> <li>クラス名を置換し、現在のクラスの静的メンバー変数と静的関数を参照します。</li> <li>ポリモーフィックな動作を抑制し、オーバーライドされた実装ではなく、現在のクラスの関数を参照します。 </li> </ol> <h2>groove point</h2> <ol> <li>これらのキーワードのうち、<code>this のみ $ 記号を追加する必要があり、強迫性障害とは、非常に不快であることを意味します。;

  • 静的メンバー関数内の $this-> を介して非静的メンバー関数を呼び出すことはできませんが、呼び出すことはできます。 self:: を介して実行され、呼び出し元の関数には含まれていませんが、$this-> を使用してもスムーズに実行できます。この動作は、PHP のバージョンによって動作が異なるようです。現在の 7.3 では問題ありません。
  • は静的関数と非静的関数 self で出力されます。結果はどうなるでしょうか?どちらも string(4) "self" で、混乱を招く出力です;
  • return $thisinstanceof static::class; 構文エラーが発生しますが、次の 2 つは通常の書き方は次のとおりです:
    $class = static::class;
    return $thisinstanceof $class;
    // あるいは次のようになります:
    return $thisinstanceof static;
  • [関連する推奨事項: laravel ビデオチュートリアル]

    以上がLaravelでのselfの使用法は何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    関連ラベル:
    ソース:php.cn
    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
    最新の問題
    人気のチュートリアル
    詳細>
    最新のダウンロード
    詳細>
    ウェブエフェクト
    公式サイト
    サイト素材
    フロントエンドテンプレート