ホームページ バックエンド開発 PHPチュートリアル PHP で static:: と new static() の間の静的バインディングを形成する方法

PHP で static:: と new static() の間の静的バインディングを形成する方法

Jun 06, 2020 pm 03:20 PM
静的バインディング

PHP で static:: と new static() の間の静的バインディングを形成する方法

#PHP::late の static と new static()

1.parent、 self, $this, __CLASS__

class A {}
class B extends A{
parent::(public|protected)(静态方法|静态变量)  ===> parent永远是A
self::(public|protected)(静态方法|静态变量)  ===> self永远是B
$this->(public|protected)(非静态方法|非静态变量)  ===> $this永远是B的是实例化对象
__CLASS__    ===> 永远是B
} 
class C extends B{
parent::(public|protected)(静态方法|静态变量)  ===> parent永远是B
self::(public|protected)(静态方法|静态变量)  ===> self永远是C
$this->(public|protected)(非静态方法|非静态变量)  ===> $this永远是C的是实例化对象
__CLASS__    ===> 永远是C 
}
ログイン後にコピー

2.static::

static キーワードは次の機能を実現できます:

1 呼び出しクラスの静的メソッドには遅延静的バインディング効果があります;

2 クラスの静的プロパティの呼び出しには遅延静的バインディング効果があります;

3 クラスの非静的メソッドの呼び出し遅延静的バインディング効果はありません ;

4 注: 非静的プロパティは呼び出すことができません;

class A {
    private static function foo() {
        echo "A success!\n";
    }
    public function test() {
         $this->foo();
    }
}
 
class B extends A {
}
 
class C extends A {
    private static function foo() {
    echo "C success!\n";
    }
}
 
$b = new B();
$b->test();//A success!
$c = new C();
$c->test();//A success!
ログイン後にコピー
class A {
    private static function foo() {
        echo "A success!\n";
    }
    public function test() {
        static::foo();
    }
}
 
class B extends A {
}
 
class C extends A {
    private static function foo() {
    echo "C success!\n";
    }
}
 
$b = new B();
$b->test();//A success!
$c = new C();
$c->test();//A无法调用C里的私有foo方法 
 
 
 
 
//将C的foo改成非private(public|protected)就可以解决
class A {
    private static function foo() {
        echo "A success!\n";
    }
    public function test() {
        static::foo();
    }
}
 
class B extends A {
}
 
class C extends A {
    public static function foo() {
    echo "C success!\n";
    }
}
 
$b = new B();
$b->test();//A success!
$c = new C();
$c->test();//C success!
ログイン後にコピー
class A {
 public static function foo() {
     static::who();
 }
 
 public static function who() {
     echo __CLASS__."\n";
 }
}
 
class B extends A {
 public static function test() {
     A::foo();
     parent::foo();
     self::foo();
 }
 
 public static function who() {
     echo __CLASS__."\n";
 }
}
class C extends B {
 public static function who() {
     echo __CLASS__."\n";
 } 
}
 
C::test(); 
A =>A::foo()的结果
C =>parent::foo()能走到A的foo,里面static::who找C::who
C =>self::foo()能走到B的foo,B继承A,走到A的foo,里面static::who找C::who
 
 
 
 
 
class A {
    protected static function foo() {
        static::who();
    }
 
    protected static function who() {
        echo __CLASS__."\n";
    }
}
 
class B extends A {
    public static function test() {
        A::foo();
        parent::foo();
        self::foo();
    }
 
    protected static function who() {
        echo __CLASS__."\n";
    }
}
class C extends B {
    protected static function who() {
        echo __CLASS__."\n";
    } 
}
 
C::test(); //A C C,解释同上
 
 
 
 
 
class A {
 public static function foo() {
     static::who();
 }
 
 private static function who() {
     echo __CLASS__."\n";
 }
}
 
class B extends A {
 public static function test() {
     A::foo();
     parent::foo();
     // self::foo();  
 }
 
 private static function who() {
     echo __CLASS__."\n";
 }
}
class C extends B {
 private static function who() {
     echo __CLASS__."\n";
 } 
}
 
C::test();
//A =>A::foo()的结果 
//报错 A不可C的私有方法who => parent::foo()能走到A的foo,里面static::who找C::who,C的who只能在C里调用,不能在A里调用
//报错 A不可C的私有方法who => self::foo()能走到B的foo,B继承A,走到A的foo,里面static::who找C::who,C的who只能在C里调用,不能在A里调用
ログイン後にコピー

3. new static()

//new self()与new static()的区别,官网例子如下: 
class A {
  public static function get_self() {
    return new self();
  }
 
  public static function get_static() {
    return new static();
  }
}
 
class B extends A {}
 
echo get_class(B::get_self()); // A
echo get_class(B::get_static()); // B
echo get_class(A::get_static()); // A
ログイン後にコピー

推奨チュートリアル: 「

PHP ビデオ チュートリアル >>

以上がPHP で static:: と new static() の間の静的バインディングを形成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHP 後期静的バインディング: 従来のプログラミングの考え方を打ち破る技術的なヒント PHP 後期静的バインディング: 従来のプログラミングの考え方を打ち破る技術的なヒント Sep 15, 2023 am 08:46 AM

PHPLate の静的バインディング: 従来のプログラミングの考え方を打ち破る技術的なヒント はじめに: 従来のプログラミングの考え方では、通常、コンパイル時にメソッドとプロパティの呼び出しを決定します。しかし、動的呼び出しが必要な場合には、この方法は制限的で不合理であるように見えます。 。 フレキシブル。 PHP は、従来のプログラミングの考え方を打ち破り、メソッドとプロパティの動的バインディングに便利な「遅延静的バインディング」という強力な機能を提供します。この記事では、具体的なコード例を通して L を紹介します。

Java の静的バインディングと動的バインディング Java の静的バインディングと動的バインディング Aug 19, 2023 pm 02:57 PM

はい!コンパイラは、メソッドの実行に使用されるオブジェクトを認識すると、そのオブジェクトへの参照を静的にバインドできます。たとえば、静的変数、プライベート変数、および最終変数は静的バインディングを使用します。実行時にオブジェクト認識が必要な場合は、動的バインディングを使用します。メソッドのオーバーライドは動的バインディングのケースです。メソッドのオーバーロードは静的バインディングのケースです。

PHP Late static バインディングを使用してコードの再利用性を向上させる方法 PHP Late static バインディングを使用してコードの再利用性を向上させる方法 Sep 15, 2023 am 11:36 AM

PHPLate 静的バインディングを使用してコードの再利用性を向上させる方法 はじめに: PHP 開発では、コードの再利用は開発効率と保守性を向上させる重要な要素の 1 つです。 PHP は、コードの再利用性を実現するためのさまざまな手法を提供します。重要な手法の 1 つは、遅延静的バインディングの使用です。この記事では、Late static binding の概念、利点、実際の開発における応用について紹介します。 1. Late static binding の概要 Late static binding とは、静的メソッドやプロパティの呼び出し方法を呼び出し時のコンテキストに基づいて動的に決定する方式のことです。存在する

PHP Late static バインディングを通じて効率的でスケーラブルなコード構造を作成する PHP Late static バインディングを通じて効率的でスケーラブルなコード構造を作成する Sep 15, 2023 am 09:00 AM

PHPLate 静的バインディングを通じて効率的でスケーラブルなコード構造を作成する 要約: 大規模なプロジェクトでは、コード構造のスケーラビリティと効率性が非常に重要です。 PHPLate 静的バインディングは、保守と拡張が簡単なコードの構築に役立つ強力な機能です。この記事では、PHPLate 静的バインディングの概念を紹介し、特定のコード例を使用して、それを使用して効率的でスケーラブルなコード構造を構築する方法を説明します。はじめに: 会社の事業が発展し、拡大し続けるにつれて、プロジェクトの規模も徐々に拡大していきます。このようにして

PHP 後期静的バインディングの技術的秘密を解明する PHP 後期静的バインディングの技術的秘密を解明する Sep 15, 2023 am 09:39 AM

PHPLate 静的バインディングの技術的秘密を明らかにするには、特定のコード サンプルが必要です。近年、PHP は一般的に使用されるサーバーサイド スクリプト言語として開発者に歓迎されています。 PHP 言語の発展に伴い、より多くのプログラミング手法や機能が PHP に追加されてきました。その 1 つが後期静的バインディングです。遅延静的バインディングとは、継承関係において、サブクラスが親クラスの静的メソッドとプロパティをオーバーライドして呼び出すことができることを意味します。この継承関係により、コードの柔軟性とスケーラビリティが大幅に向上します。それで、させてください

Java における静的バインディングと動的バインディングの違い Java における静的バインディングと動的バインディングの違い Aug 27, 2023 pm 11:09 PM

バインディングは、メソッド呼び出しとメソッドの実際の実装の間にリンクを作成するメカニズムです。 Java のポリモーフィズムの概念によれば、オブジェクトはさまざまな形式を持つことができます。オブジェクトの形式はコンパイル時と実行時に解決できます。メソッド呼び出しとメソッド実装の間のリンクがコンパイル時に解決される場合は静的バインディングと呼ばれ、実行時に解決される場合は動的バインディングと呼ばれます。動的バインディングはオブジェクトを使用してバインディングを解決しますが、静的バインディングはクラスとフィールドの型を使用します。老紳士。いいえ。キーの静的バインディング 動的バインディング 1 コンパイル時の基本解決 実行時に解決 2 解決メカニズム 静的バインディングはクラスとフィールドの型を使用します 動的バインディングはオブジェクトを使用してバインディングを解決します 3 オーバーロードの例は静的バインディングの例です メソッドのオーバーロード 書き込みは次の例です動的バインディング 4. メソッドのタイプはプライベート、

PHP Late static binding: コード継承を最適化するための技術ツール PHP Late static binding: コード継承を最適化するための技術ツール Sep 15, 2023 am 08:57 AM

PHPLate 静的バインディング: コード継承を最適化するための技術ツール 背景の紹介: オブジェクト指向プログラミングでは、継承は一般的なコード再利用テクノロジです。継承を通じて、新しいクラスを作成し、既存のクラス (親クラスまたは基本クラスと呼ばれる) からプロパティとメソッドを継承できます。このようにして、コードの重複を減らし、コードの保守性とスケーラビリティを向上させることができます。しかし、継承ではよく問題が発生します。サブクラスで親クラスの静的メソッドを呼び出すと、静的メソッドのバインドがコンパイル時に完了するため、サブクラスが静的メソッドを呼び出します。

See all articles