※当サイトの記事には、広告・プロモーションが含まれます。

PHPで擬似変数$thisって何のためにあるのか?

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を追加する」と読み変えることが可能です。

カレントオブジェクト

オブジェクト指向言語において、インスタンスメソッドが起動されたオブジェクトのこと。

Javaでは、起動したメソッドの中ではthis変数によって参照できる。

 

インスタンス(オブジェクト)がクラスを基に作られていることと、オブジェクト名(参照型変数)がどんな名前になるかは、インスタンスが作られた時になってみないと分からないってことから、クラスの中では擬似変数が用いられてるようです。

メソッドがオブジェクトコンテキストからコールされる場合は、 疑似変数 $this が利用可能です。
$this は、呼び出し元オブジェクト (通常は、メソッドが属するオブジェクトですが、 メソッドが第二のオブジェクトのオブジェクトの コンテキストから スタティックに コールされる場合には、別のオブジェクトとなる場合もあります) への参照です。

注意:

擬似変数 $this は、メソッドが静的にコールされた場合に 常に定義されるわけではありません。
しかし、はっきりしていることは: もしメソッドが別のオブジェクトから静的にコールされている場合は $this が定義されるということです。
この場合、$this は呼び出し元のオブジェクトとなります。
これを説明したのが次の例です:

 例:擬似変数$thisの注意点
<?php
/* クラスAの定義 */
class A
{
    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に設定できる定数の一覧(ビットマスクって言葉が出てきます)

PHP : 定義済み定数 - Manual

ビットマスク

情報工学におけるマスク(: mask)、またはビットマスク (bit mask) ともいうは、ビット演算と呼ぶビット単位の操作を行う処理である。

マスクを使用すると、バイトニブルワードなどの複数のビットを同時にオンやオフにしたり、ビット単位にオン/オフを反転させたり、また特定のビットの状態を知ることができる。

注目するビットを操作し、それ以外のビットを操作対象外として覆うことから、に当てる「マスク」などのようにマスクと呼ぶ。

 

⇩   PHPのerror_reporting( php.iniファイル )に設定できる定数をhttpd.confファイルで使う際に必要なビットマスク(整数値)の調べ方は下記サイトへ

[PHP] error_reportingで使用するエラーレベルのビットマスクを調べる方法

⇩   ビットマスクのしくみについては下記サイトへ(PHPではない内容です)

ビットマスクで今日からあなたも収納名人 | YU-TANG MS-Access Discovery

⇩   ビットマスクを使った複数フラグの整理方法は下記へ

PHP:複数フラグをビットマスクを使用して1つの値にして保存 - Qiita