ホームページ バックエンド開発 PHPチュートリアル オブジェクト指向 PHP_PHP チュートリアルのサブクラスでの親クラスのオーバーロードの詳細な説明

オブジェクト指向 PHP_PHP チュートリアルのサブクラスでの親クラスのオーバーロードの詳細な説明

Jul 13, 2016 am 10:49 AM
php 一度 について 物体 きちんとした 記事 詳しい説明 過負荷 のために

この記事では、PHP オブジェクト指向サブクラスでの親クラスのオーバーロードについて詳しく説明します。この記事が、PHP サブクラスでの親クラスのオーバーロードを理解するのに役立つことを願っています。


PHP では同じ名前の関数は存在できないため、同じクラス内に同じ名前のメソッドを定義することはできません。ここで言うオーバーロードとは、親クラスと同じ名前のメソッドをサブクラスに定義して、親クラスから継承したメソッドをオーバーライドできることを意味します。


サブクラスでの親クラスのメソッドのオーバーロード

コードは次のとおりです コードをコピー


クラス人{
                                                       public $name;                                                               パブリック関数 __construct($name="" ){
$this->name =$name;
                                                            }
public 関数 Say(){
echo "私の名前は".$this->name ; }
                                                          }
?>
クラス学生が 人を拡張します{
                                                       public $name;                                                               パブリック関数 __construct($name=""){
$this->name =$name;
                                                         }
//ここで親クラスと同じ名前のメソッドを定義し、親クラスのspeakingメソッドを上書きして書き換えます
public 関数 Say(){
echo "私の名前は「.$this->name .」、25 歳です" ; }
                                                          }
?>

メソッドとアクセス権のオーバーライド

サブクラスのオーバーライドされたメソッドは、親クラスのオーバーライドされたメソッドよりも制限的なアクセス許可を使用できません。

親クラスのメソッドのアクセス許可が保護されている場合、サブクラスでオーバーライドされるメソッドのアクセス許可は保護またはパブリックである必要があります。親クラスのメソッドがパブリックの場合、メソッドのアクセス許可はサブクラスでオーバーライドされるのは public のみである必要があります。おそらくこれが、サブクラスが親クラスのプライベート メンバーを継承できるものの、使用できない理由です。

書き換え時のパラメータ数

サブクラスは親クラスとは異なる数のパラメーターを持つことができます。たとえば、次のコンストラクターでは、追加のパラメーター $age が追加されます。

コードは次のとおりですコードをコピー

クラス Student が person{

を拡張します ️

public $name; 公開 $age;                                                         

パブリック関数 __construct($name="",$age=25){

$this->name =$name;

$this->age =$age;
}

パブリック関数say(){


echo "私の名前は「.$this->name .」、今年は「.$this->age.」です。」;

                                                

}

?>

コンストラクターのオーバーライド

上記の「書き換え時のパラメータの数」により、サブクラスが親クラスのコンストラクターを書き換えることができるようになりましたが、これは良い書き方ではありません。よく見ると、上記のサブクラス Class Student の書き換えが行われていることがわかります。親クラスの Person コンストラクターの実際には、親クラスのコンストラクター関数にもう 1 つのパラメーターが追加されますが、その後、親クラスの元のパラメーターが書き換えられます。親クラスの Person コンストラクターにはパラメーターが 1 つしかないため、問題なくそれを書き留めるだけです。パラメータが 1 つではなく、複数ある場合、この問題を単純化する方法はあるでしょうか。答えは「はい」です。「親::メソッド名」を使用して、サブクラスのオーバーロードされたメソッドで親クラスのオーバーライドされたメソッドを呼び出すことができます。たとえば、「parent::__construct()」を使用して、親クラスでオーバーライドされたコンストラクター メソッドを呼び出します。他のメソッドも同様であるため、上記のコードは次のように簡略化できます。

コードは次のとおりですコードをコピー

クラス Student が person{

を拡張します

️ public $name;

公開 $age                                                                                        パブリック関数 __construct($name="",$age=25){

親::__construct($name,$age);

}


public function Say(){ 親::say();
with with with with with with echo "、今年".$this->age .「歳」 ;

                                                                      }

?>


別の例を見てみましょう

PHP5の書き換え方法
まず親クラスを設定します。この親クラスは「Dog」クラスです。このクラスは犬の特性を記述します。

犬には目が2つあり、走ったり吠えたりすることができます。このように説明するだけです。

私は犬を飼っていますが、犬の特徴に当てはまりますが、違います。

私の子犬には名前があります。私の子犬は小さすぎるので、大声で吠えることができず、鼻歌を歌うことしかできません。

この設計を実装するために継承の概念を使用します。

コードは次のとおりです コードをコピー

// 犬には目が 2 つあり、吠えることも走ることもできます。
クラス犬{
protected $eyeNumber =2 //属性
; // 属性をカプセル化するメソッドを返します。
パブリック関数 getEyeNumber(){
$this->eyeNumber;
を返します }
//犬は吠えることがあります
パブリック関数 yaff(){
「犬ヤフ、ワン ..ワン ..」を返します;
}
//犬は走れます
パブリック関数 run(){
「ドッグラン..ランニング中...」を返します;
}
}
$dog = 新しい犬();
echo "犬には ".$dog->getEyeNumber()" の目があります。
";
echo $dog->yaff() ."
".$dog->run();
エコー "

";
//これは「犬」と呼ばれる私の子犬です。とても小さいので、吠えることはできません。 class MyDog extends Dog {
プライベート $name = "犬";
パブリック関数 getName(){
$this->name;
を返します }
パブリック関数 yaff(){
$this->name を返します。" yaff, heng...heng ..";
}
}
$myDog = 新しい MyDog();
echo $myDog->getName()." には ".$myDog->getEyeNumber()." の目があります。
";
echo $myDog->yaff() ."
".$myDog->run();
?>

プログラムの実行結果:

犬には目が2つあります

犬ヤフ、ワン..ワン..
ドッグラン…ランニング…

犬には目が2つあります

犬ヤフ、ヘン...ヘン...
ドッグラン…ランニング…

メソッドとアクセス権のオーバーライド

サブクラスのオーバーライドされたメソッドは、親クラスのオーバーライドされたメソッドよりも制限の厳しいアクセス許可を使用できません。

親クラスがパブリックで、サブクラスがプライベートの場合。

コードは次のとおりですコードをコピー

親クラスが public で、サブクラスが protected の場合。

// 書き換えられたアクセス権を示すために、dog クラスと mydog クラスを単純化します。
クラス犬{
protected $eyeNumber =2 //属性
; // 属性をカプセル化するメソッドを返します。
パブリック関数 getEyeNumber(){
$this->eyeNumber;
を返します }
}

クラス MyDog は Dog {

を拡張します 保護された関数 getEyeNumber(){
$this->eyeNumber;
を返します }
}
/*
class MyDog extends Dog {
プライベート関数 getEyeNumber(){
$this->eyeNumber;
を返します }
}
*/

?>

プログラムの実行結果:

致命的なエラー: MyDog::getEyeNumber() へのアクセス レベルは、E:PHPProjectstest.php の 15 行目で public (クラス Dog のように) である必要があります

コードは次のとおりです コードをコピー

// 書き換えられたアクセス権を示すために、dog クラスと mydog クラスを単純化します。
クラス犬{
protected $eyeNumber =2 //属性
; // 属性をカプセル化するメソッドを返します。
パブリック関数 getEyeNumber(){
$this->eyeNumber;
を返します }
}

クラス MyDog は Dog {
を拡張します プライベート関数 getEyeNumber(){
$this->eyeNumber;
を返します }
}

?>

プログラムの実行結果:

致命的なエラー: MyDog::getEyeNumber() へのアクセス レベルは、E:PHPProjectstest.php の 15 行目で public (クラス Dog のように) である必要があります

書き換え時のパラメータ数
サブクラスには、親クラスとは異なる数のパラメータを含めることができます。 (これは Java とは異なり、PHP は弱い型付け言語です。)

コードは次のとおりです コードをコピー


// オーバーライドされたメソッドのパラメーターを示すために、dog クラスと mydog クラスを簡略化します。
クラス犬{
protected $eyeNumber =2 //属性
; // 属性をカプセル化するメソッドを返します。
パブリック関数 getEyeNumber(){
$this->eyeNumber;
を返します }
}
class MyDog extends Dog {
//オーバーライドされたメソッドには、親クラスのメソッドとは異なる数のパラメーターがあります。
パブリック関数 getEyeNumber($eys){
$this->eyeNumber = $eys;
$this->eyeNumber;
を返します }
}

$myDog = 新しい MyDog();
echo "私の犬は ".$myDog->getEyeNumber(3) ." 目を持っています。";
//ハウリングスカイドッグ...はぁ...
//次の文はパラメータ欠落エラーを報告します
//エコー "私の犬は ".$myDog->getEyeNumber() ." 目。";
?>

プログラムの実行結果:

私の犬には目が3つあります。

コンストラクターのオーバーライド

次の例では、親クラスとサブクラスの両方に独自のコンストラクターがあり、サブクラスがインスタンス化されるときに、サブクラスのコンストラクターが呼び出されますが、親クラスのコンストラクターは呼び出されません。最初のセクションと比較してください。 . コンストラクターの継承。

コードは次のとおりです コードをコピー


//2-2 / extends1.php
//コンストラクターの継承に問題があります。
クラス動物{
パブリック $legNum = 0; パブリック関数 __construct(){
$this->legNum = 4;
echo "私は動物です
";
}
}
クラス Dog1 は Animal {
を拡張します パブリック関数 __construct(){
$this->legNum = 4;
echo "私は犬です。
";
}
}
$dog1 = 新しい Dog1();
echo "
";
echo "脚番号は ".$dog1->脚番号;
/*
サブクラスをインスタンス化するときに、コンストラクターが呼び出されます。
*/
?>

プログラムの実行結果:

私は犬です

脚番号は 4 です

注: これは Java とは異なります。Java ではコンストラクターを継承できません。サブクラスがインスタンス化されると、サブクラスのコンストラクターが呼び出され、親クラスのコンストラクターも呼び出されます。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/632690.html技術記事この記事では、PHP オブジェクト指向サブクラスでの親クラスのオーバーロードについて詳しく説明します。この記事が、PHP サブクラスでの親クラスのオーバーロードを理解するのに役立つことを願っています。 PHPでは保存できないので…
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

CakePHP データベースの操作 CakePHP データベースの操作 Sep 10, 2024 pm 05:25 PM

CakePHP でデータベースを操作するのは非常に簡単です。この章では、CRUD (作成、読み取り、更新、削除) 操作について理解します。

CakePHP の日付と時刻 CakePHP の日付と時刻 Sep 10, 2024 pm 05:27 PM

Cakephp4 で日付と時刻を操作するには、利用可能な FrozenTime クラスを利用します。

CakePHP ファイルのアップロード CakePHP ファイルのアップロード Sep 10, 2024 pm 05:27 PM

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

CakePHP ルーティング CakePHP ルーティング Sep 10, 2024 pm 05:25 PM

この章では、ルーティングに関連する次のトピックを学習します。

CakePHP について話し合う CakePHP について話し合う Sep 10, 2024 pm 05:28 PM

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー

CakePHP バリデータの作成 CakePHP バリデータの作成 Sep 10, 2024 pm 05:26 PM

Validator は、コントローラーに次の 2 行を追加することで作成できます。

CakePHP のロギング CakePHP のロギング Sep 10, 2024 pm 05:26 PM

CakePHP へのログインは非常に簡単な作業です。使用する関数は 1 つだけです。 cronjob などのバックグラウンド プロセスのエラー、例外、ユーザー アクティビティ、ユーザーが実行したアクションをログに記録できます。 CakePHP でのデータのログ記録は簡単です。 log()関数が提供されています

See all articles