[解決済み] php で親メソッドを呼び出す複数の方法
質問
最初はコンストラクタのメソッド呼び出しが両方とも動作することに戸惑いましたが、今は理解できたような気がします。拡張クラスは親のメソッドを、あたかもそのクラスで宣言されているかのように継承し、そのメソッドは親に存在します。
今、私は、メソッドを呼び出す好ましい方法(つまり、ベストプラクティス)があるかどうか疑問に思っています。
parent
または
this
というように、同じコードの実行方法として本当に同じなのか、どちらかを使う場合の注意点はないのか、などです。
すみません、考えすぎかもしれませんね。
abstract class Animal {
function get_species() {
echo "test";
}
}
class Dog extends Animal {
function __construct(){
$this->get_species();
parent::get_species();
}
}
$spike = new Dog;
解決方法は?
親クラスで終了するメソッドをサブクラスで呼び出す場合、(私が思いつく限りでは)3つのシナリオがあります。
-
メソッドがサブクラスで上書きされず、親クラスにのみ存在する。
これはあなたの例と同じで、一般的には
$this -> get_species();
この場合、両者が事実上同じであることはその通りですが、このメソッドはサブクラスに継承されているため、区別する理由はありません。そこで$this
を使用すると、継承されたメソッドとローカルに宣言されたメソッドの間で一貫性を保つことができます。 -
メソッドはサブクラスで上書きされ、親とは全く別のロジックを持つ。
この場合、明らかに
$this -> get_species();
なぜなら、親バージョンのメソッドを実行させたくないからです。 ここでも、一貫して$this
この場合、最初のケースとの区別を気にする必要はありません。 -
メソッドは親クラスを拡張し、親メソッドが実現することを追加します。
この場合、やはり
`$this -> get_species();
は、サブクラスの他のメソッドからこのメソッドを呼び出すときに使用します。 親メソッドを呼び出す場所は、親メソッドを上書きしているメソッドからです。例abstract class Animal { function get_species() { echo "I am an animal."; } } class Dog extends Animal { function __construct(){ $this->get_species(); } function get_species(){ parent::get_species(); echo "More specifically, I am a dog."; } }
オーバーライドするメソッドの外側で親メソッドを直接呼び出す必要がある場合、私が想像できる唯一のシナリオは、それらが2つの異なることを行い、ローカルではなく親のバージョンのメソッドが必要であるとわかっている場合です。 このようなことは起こらないはずですが、もしこのようなことが起こった場合は、次のような名前の新しいメソッドを作成するのがきれいな方法でしょう。
get_parentSpecies()
このメソッドは、親メソッドを呼び出すだけです。
function get_parentSpecies(){
parent::get_species();
}
繰り返しますが、これによってすべてがうまく一貫性を保ち、親メソッドに依存することなくローカルメソッドの変更/修正を可能にします。
関連
-
[解決済み】Laravel 5.2 Storage::makeDirectory($dir) でディレクトリが作成されない。
-
[解決済み] Uncaught Error: 未定義の関数 mysql_escape_string() の呼び出し。
-
[解決済み] PHP product.php?id=1 のような URL を作成する方法
-
[解決済み] PHPで配列から要素を削除する
-
[解決済み] PHPでSQLインジェクションを防ぐにはどうしたらいいですか?
-
[解決済み] PHPでHTML/XMLをパースして処理する方法とは?
-
[解決済み] PHPのエラーを表示させるにはどうしたらいいですか?
-
[解決済み] PHPのstartWith()関数とendsWith()関数
-
[解決済み】PHPの'foreach'は実際どのように動作するのですか?
-
[解決済み] リファレンス - このシンボルはPHPで何を意味するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】phpのob_start()の使い道は?
-
[解決済み】「セッションキャッシュリミッターを送信できません - ヘッダーはすでに送信されています」【重複】。
-
[解決済み】 PHP 未定義関数の呼び出し
-
[解決済み】XAMPPのphpMyAdminで「設定にあるcontroluserの接続に失敗しました。
-
[解決済み】XAMPPエラー: www.example.com:443:0 サーバー証明書に、サーバー名と一致するIDが含まれていません。
-
[解決済み] $wpdb->update または $wpdb->insert を実行すると、引用符の前にスラッシュが追加される
-
[解決済み】未定義のメソッド mysqli_stmt::get_result を呼び出す。
-
[解決済み】メッセージ。Trying to access array offset on value of type null [重複]配列のオフセットにアクセスしようとしています。
-
[解決済み】file_get_contents( )が動作しない。
-
[解決済み] オートロードとは何ですか; spl_autoload、__autoload、spl_autoload_register はどのように使うのですか?