[解決済み] どのような場合に '$this' よりも 'self' を使うべきですか?
2022-03-14 23:21:29
質問
PHP 5 では、以下のような違いがあります。
self
と
$this
?
それぞれどのような場合に適切ですか?
どのように解決するのか?
簡単な答え
<ブロッククオート
使用方法
$this
を参照するために、現在の
オブジェクトを作成します。使用方法
self
を参照するために
現在のクラス。言い換えれば
$this->member
は非静的メンバ用です。
使用
self::$member
は静的メンバ用です。
フルアンサー
以下はその例です。
正しい
の使用法
$this
と
self
は、非静的メンバ変数と静的メンバ変数に対応します。
<?php
class X {
private $non_static_member = 1;
private static $static_member = 2;
function __construct() {
echo $this->non_static_member . ' '
. self::$static_member;
}
}
new X();
?>
以下はその例です。
不正確
の使い方
$this
と
self
は、非静的メンバ変数と静的メンバ変数に対応します。
<?php
class X {
private $non_static_member = 1;
private static $static_member = 2;
function __construct() {
echo self::$non_static_member . ' '
. $this->static_member;
}
}
new X();
?>
以下はその例です。
ポリモーフィズム
で
$this
をメンバー関数に使用します。
<?php
class X {
function foo() {
echo 'X::foo()';
}
function bar() {
$this->foo();
}
}
class Y extends X {
function foo() {
echo 'Y::foo()';
}
}
$x = new Y();
$x->bar();
?>
以下はその例です。
ポリモーフィックな振る舞いを抑制する
を使用することで
self
をメンバー関数に使用します。
<?php
class X {
function foo() {
echo 'X::foo()';
}
function bar() {
self::foo();
}
}
class Y extends X {
function foo() {
echo 'Y::foo()';
}
}
$x = new Y();
$x->bar();
?>
という考え方があります。
$this->foo()
を呼び出します。foo()
のメンバ関数で、現在のオブジェクトの正確な型が何であれ、その型を返します。もしオブジェクトがtype X
を呼び出します。X::foo()
. オブジェクトがtype Y
を呼び出します。Y::foo()
. しかし、self::foo()で。X::foo()
が常に呼び出されます。
から http://www.phpbuilder.com/board/showthread.php?t=10354489 :
関連
-
[解決済み】php, mysql - データベースへの接続数が多すぎるエラー
-
[解決済み】mysqli_select_db()は、パラメータ1がmysqliであることを期待し、文字列が与えられる。
-
[解決済み] let "と "var "の使い分けは?
-
[解決済み] staticmethodとclassmethodの違いについて
-
[解決済み] Inversion of Controlとは?
-
[解決済み] インターフェースと抽象クラスの違いは何ですか?
-
[解決済み] 抽象メソッドと仮想メソッドの違いは何ですか?
-
[解決済み] パブリック、プライベート、プロテクトの違いは何ですか?
-
[解決済み] Pythonの旧スタイルのクラスと新スタイルのクラスの違いは何ですか?
-
[解決済み] リファレンス - このシンボルは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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】XAMPPポート80をPID 4の「Unable to open process」が使用中 [重複] XAMPPポート80をPID 4の「Unable to open process」が使用中。]
-
[解決済み】PHP定数「PHP_EOL」はいつ使うの?
-
[解決済み】 PHP 未定義関数の呼び出し
-
[解決済み】DateTimeクラスのオブジェクトを文字列に変換できない
-
[解決済み】mysqli_select_db()は、パラメータ1がmysqliであることを期待し、文字列が与えられる。
-
[解決済み】PHPの予期しないT_VARIABLEとは何ですか?
-
[解決済み】既に開始されているPHPセッション【重複あり
-
[解決済み】PDOException SQLSTATE[HY000] [2002] そのようなファイルまたはディレクトリがありません。
-
MacでPHPを実行した際に、メモリサイズが134217728バイトも消費される問題の解決方法について
-
[解決済み】mysqli::query(): mysqli をフェッチできない