14. Final キーワードの適用
このキーワードはクラスとメソッドの定義にのみ使用できます。
final は定数を意味し、PHP で定数を定義するために使用されます。 () 関数なので、final をメンバー属性の定義に使用することはできません。
final キーでマークされたクラスは継承できません。
コード スニペット
final class Person{
… …
}
class Student extends Person{
}
次のエラーが表示されます:
致命的なエラー: Class Student は Final から継承できません。 class (Person)
final キーでマークされたメソッドはサブクラスによってオーバーライドできず、最終バージョンです。 ) {
}
}
次のエラーが発生します:
致命的なエラー: 最終メソッド Person::say() をオーバーライドできません
15. static キーワードと const キーワードの使用
static キーワードは、クラス内のメンバー プロパティとメンバー メソッドを記述します。静的として;静的メンバーの利点は何ですか?
先ほど人間を「人」と宣言しました。「人」クラスに「人が属する国」の属性を追加すると、それぞれ「人」クラスを使用してインスタンスを作成できます。オブジェクトは「属する国」という属性を持ちます。プロジェクトが中国人向けに開発されている場合、各オブジェクトは「中国」という属性を持ち、「国」という属性を作成すると、その国の属性は異なります。静的
メンバーの場合、メモリ内には国属性が 1 つだけ存在し、数百以上のオブジェクトがこの属性を共有できるようになります。静的メンバーはクラスに属し、どのオブジェクトにも属さないため、
静的メンバーは外部アクセスを制限できます。これは、クラスが初めてロードされるときに割り当てられる領域であり、他のクラスからはアクセスできず、クラスのメンバーをある程度まで保護できます。メモリの観点では、メモリは論理的に 4 つのセグメントに分割され、オブジェクトは「ヒープ メモリ」に配置され、オブジェクトの参照は「スタック メモリ」に配置されます。静的メンバーは、クラスが初めてロードされるときに配置される「初期化された静的セグメント」に配置されます。以下に示すように、ヒープ メモリ内のすべてのオブジェクトで共有できます。クラスはグローバル変数に非常に似ており、グローバル関数と同様に、クラスのすべてのインスタンスで共有できます。
コードスニペット
<? class Person{ //下面是人的静态成员属性 public static $myCountry="中国"; // var $name; //人的名子 //这是人的静态成员方法 public static function say(){ echo "我是中国人<br>"; } } //输出静态属性 echo Person::$myCountry; //访问静态方法 Person::say(); //重新给静态属性赋值 Person::$myCountry="美国"; echo Person::$myCountry; ?>
静的メンバーはクラスが最初にロードされるときに作成されるため、クラスの外部のオブジェクトを必要とせずにクラス名を使用して静的メンバーにアクセスできます。静的メンバーは、このクラスのすべてのメンバーによってアクセスされます。インスタンスオブジェクトがある場合、そのオブジェクトを使用してクラス内の静的メンバーにアクセスできますか?上の図から、各オブジェクト内には静的メンバーが存在しないことがわかりますが、各オブジェクトは共有できるため、オブジェクトを使用してメンバーにアクセスすると、そのような属性定義がなくなり、オブジェクトにアクセスできなくなります。静的メンバー Java などの他のオブジェクト指向言語では、オブジェクトを使用して静的メンバーにアクセスできる場合は、作業時に静的メンバーを使用するため、それらを使用しないようにする必要があります。プロジェクトでは、クラス名を使用してアクセスすることが目的です。クラス内の静的メソッドは、クラスの静的属性にのみアクセスできます。クラス内の静的メソッドは、クラスの非静的メンバーにアクセスできません。理由は非常に簡単です。 class. では、参照 $this を使用する必要があり、参照ポインター $this は、このメソッドを呼び出すオブジェクトを表します。静的メソッドはオブジェクトで呼び出されるのではなく、名前を使用してアクセスされるため、オブジェクトはまったく存在しません。 $this 参照がないと、クラス内の非静的メンバーにアクセスできません。また、クラス内の静的メンバーにはオブジェクトなしでアクセスできるため、クラス内の静的メソッドは、静的属性。 $this が存在しないため、静的メソッド内の他の静的メンバーにアクセスするために特別なクラス "self" を使用します。self は、この静的メソッドが配置されているクラスを表す点を除いて $this と似ています。 。したがって、静的メソッドでは、メソッドが配置されているクラスの「クラス名」を使用することも、他の静的メンバーにアクセスするために「self」を使用することもできます。特別な事情がない場合、通常は後者を使用します。それは、「self:: member」プロパティ」の方法です。
コードスニペット
<? class Person{ //下面是人的静态成员属性 public static $myCountry="中国"; //这是人的静态成员方法, 通过self访问其它静态成员 public static function say(){ echo "我是".self::$myCountry."<br>"; } } //访问静态方法 Person::say(); ?>
静的メンバーに非静的メソッドでアクセスすることは可能ですか? もちろん可能ですが、「$this」参照にはクラス名または「self:: member 属性形式」も使用する必要があります。
const は定数を定義するためのキーワードです。PHP で定数を定義するには「define()」関数を使用しますが、クラス内で定数を定義するには、C の #define に似た「const」キーワードを使用します。 「const」で変更したメンバ属性は、「static」で変更したメンバ属性と同様にアクセスされ、プログラム内で値を変更するとエラーとなります。 「自分」というキーワード。ただし、「$」記号を使用する必要はなく、オブジェクトを使用してアクセスすることもできません。
コード スニペット
<?php class MyClass{ //定义一个常量constant const constant = 'constant value'; function showConstant() { echo self::constant . "\n"; //使用self访问,不要加”$” } } echo MyClass::constant . "\n"; //使用类名来访问,也不加”$” $class = new MyClass(); $class->showConstant(); // echo $class::constant; 是不允许的