オブジェクトOOP
1.致命的なエラー: オブジェクトコンテキストにないときに $this を使用する
OOP を初めて学習する場合、よく理解していない概念があるため、この間違いは間違いなく起こりやすいです。 クラスのアクセシビリティは、海外にいる中国人がどの文化にも属しておらず、外国語を話せない(おそらく少しは話せる)と考えることもできます。外国人とコミュニケーションを取るのは、同じ国に生まれたわけではないからです。
では、エラーはどのようにして起こるのでしょうか?以下の例を見てください:
1
2クラストロン{
3 static public $fire = "私は火です。";
4 public $water = "私は水です";
5
6 静的関数 getFire( ) {
7 return $this->fire // 間違っています
8 }
9 静的関数 getWater( ) {
10 return $self::water // 間違っています
;
11 }
12
13 静的関数 Fire( ) {
14 return self::$fire; // 関数を呼び出す前に、必ず self を使用して静的プロパティにアクセスしてください
15 }
16}
17
18/*
19 致命的なエラー: オブジェクト コンテキスト内にないときに $this を使用する
20*/
21 //エコー Trones::getFire( ) ;
22 //エコー Trones::getWater( ) ;
23
24 // 正解です
25 エコー トロン::ファイア( );
26 エコー「
」
27 $trones = 新しいトロン ;
28 $trones->fire ; // 注意: 未定義のプロパティ: Trones::$fire (異なるエラー設定に基づく) 単純なエラーです
29 エコー トロン::$ファイア ;
この間違いは非常に古典的であり、非常に実用的です。まず静的な定義を見てみましょう。
クラスのプロパティまたはメソッドを静的として宣言すると、クラスのインスタンス化を必要とせずにアクセスできるようになります。静的として宣言されたプロパティには、インスタンス化されたクラス オブジェクトではアクセスできません (静的メソッドではアクセスできます)。
翻訳: クラスのプロパティまたはメソッドを静的として定義すると、クラスを初期化せずに直接アクセスできるようになります。静的として定義されたプロパティには、オブジェクト演算子 * -> * を使用してクラスのオブジェクトからアクセスすることはできません (静的メソッドを通じてアクセスできます)。
例:
7 行目と 10 行目も同じ間違いを犯しました。最初の間違いは、オブジェクト演算子を使用して静的変数にアクセスすることでした。定義を見ると、$this はオブジェクト、つまりインスタンスに相当する疑似変数です。オブジェクト演算子 -> を使用してアクセスすると、エラーが報告されます。
同様に、静的演算子 :: を使用してパブリック変数にアクセスすることはできません。 正しいアクセスは 14 行目と 25 行目です。1 つはクラスの定義 (self:: === Trones::) 内でアクセスされ、もう 1 つはクラス外でアクセスされます。
継承されたクラスには、上記と同じルールが適用されます。
-------------------------------------------------- - - 分割線 - - - - - - - - - - - - - - - - - - - - - - ------------------------------------------
2.致命的なエラー: プライベートメソッドの呼び出し
最近、「ゲーム・オブ・スローンズ」という非常に興味深いテレビシリーズがあります。7 人の王、一般人、そしてドラゴンの女性の 3 つのパーティがいると仮定します。 3人は以下で最終優勝、栄冠を争った。
次のストーリーにもタイトルがあります: Class Visibility (可視性) 最終的な答えがわかっている場合は、説明部分をスキップできます。
1
2
3 クラス トロン {
4 protected $fire = " fire ";
5 public $water = " 水 " ;
6 静的プライベート $trones = "Trones";
7
8 保護された関数 getFire( ) {
9 $this->fire ;
10 }
11
12 静的パブリック関数 TheDragenOfMather( ) {
13 return __METHOD__." use ".$this->getFire()." は ".self::getTrones( ) ;
" を取得します
14 }
15
16 静的パブリック関数 getWater( ) {
17 __METHOD__ を返す ;
18 }
19
20 静的プライベート関数 getTrones( ) {
21 自己::$trones を返します ;
22 }
23
24}
25
26クラスのキングスがトロンズを拡張 {
27 静的関数 TheSevenKing( ) {
28 return __METHOD__." は ".self::getTrones();
" を取得します
29 }
30}
31
32 クラスの人々が Trones を拡張します{
33 静的関数 ThePeople( ) {
34 return __METHOD__." は ".self::getTrones();
" を取得します
35 }
36}
37 エコーキングス::ザセブンキング( ) ;
38 エコー トロンズ::TheDragenOfMather( ) ;
39 エコー People::ThePeople( ) ;
正解は「7カ国による戦争は国内で行われ、多数の民間人が犠牲となった。ドラゴンガールはこの状況を利用しようとしたが、残念ながら最終的には誰も栄冠も勝利も得られなかった。」ははは。
静的とプライベートが融合すると、大学の教師が教える数学の授業のように、複雑さと美しさが生まれます。
Dragon Girl に最終的な勝利をもたらしたい場合は、彼女が 13 行目の $this->getFire() 部分を削除するのを手伝うだけです。同様に、静的関数ではオブジェクト演算子を使用できません。
どうすれば人々のために王冠を手に入れることができるでしょうか?
大規模なフレームワークや Web サイトを構築しない場合、インターフェイスの実装などの概念は抽象的です。 。 。 知らないほうがいいですよ。
ウォークラフトより抜粋
)