ホームページ バックエンド開発 PHPチュートリアル PHP5中虚函数的实现方法分享_php技巧

PHP5中虚函数的实现方法分享_php技巧

May 17, 2016 am 09:20 AM
php5 仮想関数

请看下面的代码:

复制代码 代码如下:

class A {
public function x() {
echo "A::x() was called.\n";
}
public function y() {
self::x();
echo "A::y() was called.\n";
}
public function z() {
$this->x();
echo "A::z() was called.\n";
}
}
class B extends A {
public function x() {
echo "B::x() was called.\n";
}
}
$b = new B();
$b->y();
echo "--\n";
$b->z();
?>

该例中,A::y()调用了A::x(),而B::x()覆盖了A::x(),那么当调用B::y()时,B::y()应该调用A::x()还是 B::x()呢?在C++中,如果A::x()未被定义为虚函数,那么B::y()(也就是A::y())将调用A::x(),而如果A::x()使用 virtual关键字定义成虚函数,那么B::y()将调用B::x()。然而,在PHP5中,虚函数的功能是由 self 和 $this 关键字实现的。如果父类中A::y()中使用 self::x() 的方式调用了 A::x(),那么在子类中不论A::x()是否被覆盖,A::y()调用的都是A::x();而如果父类中A::y()使用 $this->x() 的方式调用了 A::x(),那么如果在子类中A::x()被B::x()覆盖,A::y()将会调用B::x()。

上例的运行结果如下:
A::x() was called. A::y() was called. --
B::x() was called. A::z() was called.
virtual-function.php
复制代码 代码如下:

class ParentClass {
static public function say( $str ) {
static::do_print( $str );
}
static public function do_print( $str ) {
echo "

Parent says $str

";
}
}
class ChildClass extends ParentClass {
static public function do_print( $str ) {
echo "

Child says $str

";
}
}
class AnotherChildClass extends ParentClass {
static public function do_print( $str ) {
echo "

AnotherChild says $str

";
}
}
echo phpversion();
$a=new ChildClass();
$a->say( 'Hello' );
$b=new AnotherChildClass();
$b->say( 'Hello' );
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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)

php5とphp8の違いは何ですか php5とphp8の違いは何ですか Sep 25, 2023 pm 01:34 PM

php5 と php8 の違いは、パフォーマンス、言語構造、型システム、エラー処理、非同期プログラミング、標準ライブラリ関数、セキュリティの点です。詳細な紹介: 1. パフォーマンスの向上. PHP5 と比較して、PHP8 はパフォーマンスが大幅に向上しています. PHP8 では、高頻度の実行コードをコンパイルおよび最適化できる JIT コンパイラーが導入されており、それによって実行速度が向上しています; 2. 言語構造の改善、 PHP8 では、いくつかの新しい言語構造と関数が導入されており、PHP8 では名前付きパラメータがサポートされており、開発者はパラメータの順序などの代わりにパラメータ名を渡すことができます。

php5でポート80を変更する方法 php5でポート80を変更する方法 Jul 24, 2023 pm 04:57 PM

php5 でポート 80 を変更する方法: 1. Apache サーバー設定ファイルのポート番号を編集します; 2. PHP 設定ファイルを編集して、PHP が新しいポートで動作することを確認します; 3. Apache サーバーを再起動すると、PHP アプリケーションが起動します。新しいポートで実行を開始します。ポートで実行します。

C++ 関数のオーバーロードと仮想関数はどのように連携しますか? C++ 関数のオーバーロードと仮想関数はどのように連携しますか? Apr 26, 2024 am 10:09 AM

C++ での関数のオーバーロードを使用すると、異なるパラメーターを持つ同じ名前の関数の異なる実装を定義できます。また、仮想関数を使用すると、派生クラスで基本クラスの関数をオーバーライドしてポリモーフィズムを実現できます。関数のオーバーロードと仮想関数は連携して動作できます。基本クラスで仮想オーバーロード関数を設計することで、派生クラスは特定のパラメーターの組み合わせのバージョンのみをオーバーロードできるため、実際のケースでは異なる型の距離を計算するなど、より柔軟な多態性が提供されます。原点からの形。

C++ 関数のデバッグの詳細な説明: 仮想関数の問題をデバッグするには? C++ 関数のデバッグの詳細な説明: 仮想関数の問題をデバッグするには? May 02, 2024 pm 03:42 PM

仮想関数のデバッグ方法: ブレークポイントを設定してステップ実行し、assert() を使用して条件を確認し、デバッガー ツールを使用して動的型、関数スタックを確認し、仮想関数を再定義します。

php5がポート9000でリッスンしない問題を解決する方法 php5がポート9000でリッスンしない問題を解決する方法 Jul 10, 2023 pm 04:01 PM

php5 がポート 9000 をリッスンしない場合の解決手順: 1. PHP-FPM 構成ファイルを確認します; 2. PHP-FPM サービスを再起動します; 3. ファイアウォールをオフにするか、ポート転送を構成します; 4. 他のプロセスがポート 9000 を占有しているかどうかを確認します。

php7 と php5 の構文の違いは何ですか php7 と php5 の構文の違いは何ですか Jul 10, 2023 pm 03:25 PM

php7 と php5 の構文の違いは次のとおりです: 1. PHP7 では厳密な型宣言が導入されていますが、PHP5 変数の型は暗黙的です; 2. PHP7 ではスカラー型宣言のサポートが導入されていますが、PHP5 ではサポートされていません; 3. PHP7 では NULL Merge 演算子が導入されていますが、PHP7 では NULL Merge 演算子が導入されています。 PHP5 では、変数が存在するかどうか、null ではないかどうかをチェックします。条件文を使用する必要があります。 4. PHP7 には新しい比較演算子「<=>」が追加されていますが、PHP5 にはありません。 5. PHP7 では、新機能の匿名クラスが導入されていますが、PHP5 では、ではない。

C++ フレンド関数と仮想関数間の相互作用 C++ フレンド関数と仮想関数間の相互作用 Apr 16, 2024 pm 03:45 PM

C++ では、フレンド関数は仮想関数と対​​話するため、フレンド関数は仮想関数にアクセスし、派生クラスのフレンド関数を呼び出して基本クラスのプライベート メンバーにアクセスできます。この対話を使用して、継承階層に隠されたデータにアクセスしたり、多態性の動作を実装したりできます。

C++ で仮想関数を宣言して呼び出すにはどうすればよいですか? C++ で仮想関数を宣言して呼び出すにはどうすればよいですか? Apr 12, 2024 pm 04:03 PM

仮想関数は、派生クラスがその基本クラスのメンバー関数をオーバーライドできるようにするポリモーフィズム メカニズムです。 宣言: 関数名の前にキーワード virtual を追加します。呼び出し: 基本クラスのポインターまたは参照を使用して、コンパイラーは派生クラスの適切な実装に動的にバインドします。実際のケース: 基本クラス Shape とその派生クラス Rectangle および Circle を定義することにより、多態性における仮想関数の適用、面積の計算、形状の描画を示します。

See all articles