クラスの継承はプログラマーとして基本的に毎日扱っていますが、いくつかのことを本当に知っていますか?公式サイトから確認できる内容は以下の通りです。
クラスは宣言で extends キーワードを使用して、別のクラスのメソッドとプロパティを継承できます。 PHP は多重継承をサポートしていません。クラスは 1 つの基本クラスからのみ継承できます。
継承されたメソッドとプロパティは、同じ名前で再宣言することでオーバーライドできます。ただし、親クラスがメソッドを定義するときに Final を使用する場合、そのメソッドをオーバーライドすることはできません。オーバーライドされたメソッドまたはプロパティには、parent:: を通じてアクセスできます。
メソッドをオーバーライドするときは、パラメータが一貫している必要があります。そうでない場合、PHP は E_STRICT レベルの エラー メッセージ を発行します。例外は constructor で、オーバーライド時に異なるパラメーターを受け取ることができます。
基本的な概念は誰もが知っているはずですが、私はプロジェクト内で Final とparent:: を実際に使用したことがありません。これは恥ずかしいことです。
以下では主にこれら 2 つのキーワードの使用法について説明します。
Final キーワード
PHP 5 の新しいキーワード。親クラスのメソッドが Final として宣言されている場合、サブクラスはそのメソッドをオーバーライドできません。同様に、クラスがfinalと宣言されている場合、そのクラスを継承することはできません。
プロパティをfinalとして定義することはできず、finalとして定義できるのはクラスとメソッドのみであることに注意してください。
スコープ解決演算子 (::)
範囲解決演算子、またはもっと単純にコロンのペアは、静的メンバー、クラス定数にアクセスするために使用でき、また、クラス の プロパティとメソッドをオーバーライドするためにも使用できます。
3 つの特別なキーワード self、parent、static は、クラス定義内のプロパティまたはメソッドにアクセスするために使用されます。
サブクラスが親クラスのメソッドをオーバーライドする場合、PHP は親クラスでオーバーライドされたメソッドを呼び出しません。親クラスのメソッドを呼び出すかどうかは子クラスに依存します。このメカニズムは、コンストラクターとデストラクター、オーバーロード、およびマジック メソッドにも機能します。
親クラスのメソッドを呼び出す例を次に示します:
<?php class MyClass { protected function myFunc() { echo "MyClass::myFunc()\n"; } } class OtherClass extends MyClass { // 覆盖了父类的定义 public function myFunc() { // 但还是可以调用父类中被覆盖的方法 parent::myFunc(); echo "OtherClass::myFunc()\n"; } } $class = new OtherClass(); $class->myFunc(); /** * 输出结果 -> * MyClass::myFunc() * OtherClass::myFunc() */ ?>
クラス定義の外でこれらの項目を参照する場合は、クラス名を使用します。
::class PHP 5.5 以降、キーワード class はクラス名の解析にも使用できます。 ClassName::class を使用すると、クラス ClassName の完全修飾名を含む文字列を取得できます。これは、名前空間を使用するクラスに特に便利です。これらは今後議論される可能性があります。この概念については、現在も php5.3 を使用しています。
でも、正直に言うと、小さなプロジェクトでは非常に使いにくいキーワードもありますが、それでももっと知る必要があると思います。特にサードパーティのクラス ライブラリを使用する場合、そのプログラム ロジックを詳細に検討すると、常に何かを学ぶことができます。長い間使わないと忘れてしまうものもあるかもしれませんが、結局のところ、それらはあなたの心を通過し、残りの人生に必ず何らかの痕跡を残します。
最後に、これ以上苦労せずに、範囲解析演算子 (::) のアプリケーションのコードを共有しましょう。あなたもそれを体験することができます:
<?php class cA { /** * 直接使用的测试属性的默认值 */ protected static $item = 'Foo'; /** * 间接使用的测试属性的默认值 */ protected static $other = 'cA'; public static function method() { print self::$item."\r\n"; print self::$other."\r\n"; } public static function setOther($val) { self::$other = $val; } } class cB extends cA { /** * 重定义测试属性的默认值 */ protected static $item = 'Bar'; public static function setOther($val) { self::$other = $val; } /** * 不重新声明 method()方法 */ } class cC extends cA { /** * 重定义测试属性的默认值 */ protected static $item = 'Tango'; public static function method() { print self::$item."\r\n"; print self::$other."\r\n"; } /** * 不重新声明 setOther()方法 */ } class cD extends cA { /** * 重定义测试属性的默认值 */ protected static $item = 'Foxtrot'; /** * 不重新声明 任何方法来实现上述过程 */ } cB::setOther('cB'); // cB::method()! cB::method(); // cA::method()! cC::setOther('cC'); // cA::method()! cC::method(); // cC::method()! cD::setOther('cD'); // cA::method()! cD::method(); // cA::method()! /** * 输出结果 -> * Foo * cB * Tango * cC * Foo * cD */ ?>
PHP はクラス継承のコード例を拡張します:
< ?php class a{ public $x; public $y; function construct($x=0,$y=0){ $this->x=$x; $this->y=$y; } function getx(){ return $this->x; } function gety(){ return $this->y; } function destruct(){} } class a2 extends a{} /*extends是一个继承函数*/ $b2=new a2(10,10); echo $b2->getx()."<br>"; echo $b2->gety(); ?>
上で紹介した内容です。 PHP はクラスの継承を拡張します。すべての実装手順です。
以上がPHP継承クラスextendsの使い方を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。