PHPで擬似変数$thisって、何のためにあるの?と思ったので調べてみました。
例:擬似変数$this
<?php
/* クラスCartを定義 */
class Cart
{
// 全てpublicなプロパティ
var $todays_date;
var $name;
var $owner;
var $items = array("VCR", "TV");
// publicなメソッド
function Cart()
{
$this->todays_date = date("Y-m-d");
$this->name = $GLOBALS['firstname'];
/* 等など. . . */
}
}
$cart = new Cart; // オブジェクト名(参照型変数)$cart
$cart->add_item("10", 1);
$another_cart = new Cart; // オブジェクト名(参照型変数)$another_cart
$another_cart->add_item("0815", 3);
?>
クラス定義の内部では、プログラムでアクセス可能なオブジェクト名を知ることはできません。
Cart クラスが書かれている時点では、そのオブジェクトの名前が後で $cart になるのか $another_cart になるのか、 それとも別のものになるのかはわかりません。
つまり、Cart クラスの中では $cart->items と書くことはできないのです。
代わりに、 クラスの中からそのクラス内の関数や変数にアクセスするために、 疑似変数 $this を使用することが可能です。
$this は、「自分自身の」または「カレントのオブジェクト」 と読み変えることができます
。
つまり、 '$this->items[$artnr] += $num' は、 「同じクラス内の配列 items の $artnr カウンタに $num を追加する」または「カレントオブジェクト内の配列 items の $artnr カウンタに $numを追加する」と読み変えることが可能です。
インスタンス(オブジェクト)がクラスを基に作られていることと、オブジェクト名(参照型変数)がどんな名前になるかは、インスタンスが作られた時になってみないと分からないってことから、クラスの中では擬似変数が用いられてるようです。
メソッドがオブジェクトコンテキストからコールされる場合は、 疑似変数 $this が利用可能です。
$this は、呼び出し元オブジェクト (通常は、メソッドが属するオブジェクトですが、 メソッドが第二のオブジェクトのオブジェクトの コンテキストから スタティックに コールされる場合には、別のオブジェクトとなる場合もあります) への参照です。
注意:
擬似変数 $this は、メソッドが静的にコールされた場合に 常に定義されるわけではありません。
しかし、はっきりしていることは: もしメソッドが別のオブジェクトから静的にコールされている場合は $this が定義されるということです。
この場合、$this は呼び出し元のオブジェクトとなります。
これを説明したのが次の例です:
{
function foo()
{
if (isset($this)) {
echo '$this is defined (';
echo get_class($this);
echo ")<br>\n";
} else {
echo "\$this is not defined.<br>\n";
}
}
}
class B
{
function bar()
{
// 注意: E_STRICT が有効な場合、次の行で警告が発生します
A::foo();
}
}
$a = new A();
$a->foo();
// 注意: E_STRICT が有効な場合、次の行で警告が発生します
A::foo();
$b = new B();
$b->bar();
// 注意: E_STRICT が有効な場合、次の行で警告が発生します
B::bar();
?>
PHP5.4からはエラーレベルE_STRICTがE_ALLに含まれています。
⇩ 詳しくは下記サイトへ
・PHP5.4からはエラーレベルE_STRICTがE_ALLに含まれている-いつクリはてブロ
⇩ error_reportingの変更履歴などはこちら
・PHP : error_reporting - Manual
⇩ php.iniファイルのerror_reportingに設定できる定数の一覧(ビットマスクって言葉が出てきます)
ビットマスク
情報工学におけるマスク(英: mask)、またはビットマスク (bit mask) ともいうは、ビット演算と呼ぶビット単位の操作を行う処理である。
マスクを使用すると、バイト、ニブル、ワードなどの複数のビットを同時にオンやオフにしたり、ビット単位にオン/オフを反転させたり、また特定のビットの状態を知ることができる。
注目するビットを操作し、それ以外のビットを操作対象外として覆うことから、顔の口に当てる「マスク」などのようにマスクと呼ぶ。
⇩ PHPのerror_reporting( php.iniファイル )に設定できる定数をhttpd.confファイルで使う際に必要なビットマスク(整数値)の調べ方は下記サイトへ
・[PHP] error_reportingで使用するエラーレベルのビットマスクを調べる方法
⇩ ビットマスクのしくみについては下記サイトへ(PHPではない内容です)
・ビットマスクで今日からあなたも収納名人 | YU-TANG MS-Access Discovery
⇩ ビットマスクを使った複数フラグの整理方法は下記へ