$thisとは?
状態:-
閲覧数:2,627
投稿日:2013-11-03
更新日:2013-11-03
・生成されたオブジェクト自身へのリファレンス(同じ変数の内容を異なった名前でコールすること。実体の別名)
P … 親クラスインスタンス生成。親クラス内での$this
概要
「プロパティ」オーバライド
・親クラスのインスタンスを生成
・親クラス内での$thisの挙動確認
→ 全て親クラス
ケース1
・親クラスプロパティprotected
・子クラスプロパティprotected
→親クラスプロパティ
class Oya{
protected $price="100";
public function getPrice(){ // ゲッター
return $this->price;
}
}
class Ko extends Oya{
protected $price="50"; // プロパティをオーバーライド
}
$oya = new Oya();//親クラスのインスタンスオブジェクトを生成
echo '親クラスのインスタンスオブジェクトプロパティ' . $oya->getPrice(),PHP_EOL;
// 処理結果
// 親クラスのインスタンスオブジェクトプロパティ100
ケース2
・親クラスプロパティprivate
・子クラスプロパティprivate
→親クラスプロパティ
class Oya{
private $price="100";
public function getPrice(){ // ゲッター
return $this->price;
}
}
class Ko extends Oya{
private $price="50";
}
$oya = new Oya();//親クラスのインスタンスオブジェクトを生成
echo '親クラスのインスタンスオブジェクトプロパティ' . $oya->getPrice(),PHP_EOL;
// 処理結果
// 親クラスのインスタンスオブジェクトプロパティ100
ケース3
・親クラスプロパティprivate
・子クラスプロパティprotected
→親クラスプロパティ
class Oya{
private $price="100";
public function getPrice(){ // ゲッター
return $this->price;
}
}
class Ko extends Oya{
protected $price="50";
}
$oya = new Oya();//親クラスのインスタンスオブジェクトを生成
echo '親クラスのインスタンスオブジェクトプロパティ' . $oya->getPrice(),PHP_EOL;
// 処理結果
// 親クラスのインスタンスオブジェクトプロパティ100
P … 子クラスインスタンス生成。子クラス内での$this
概要
「プロパティ」オーバライド
・子クラスのインスタンスを生成
・子クラス内での$thisの挙動確認
→ 全て子クラス
ケース1
・親クラスプロパティprotected
・子クラスプロパティprotected
→子クラスプロパティ
class Oya{
protected $price="100";
}
class Ko extends Oya{
protected $price="50"; // プロパティをオーバーライド
public function getPrice(){ // ゲッター
return $this->price;
}
}
$ko = new Ko();//子クラスのインスタンスオブジェクトを生成
echo '子クラスのインスタンスオブジェクトプロパティ' . $ko->getPrice(),PHP_EOL
// 処理結果
// 子クラスのインスタンスオブジェクトプロパティ50
ケース2
・親クラスプロパティprivate
・子クラスプロパティprivate
→子クラスプロパティ
※子クラス$thisから見た場合、privateプロパティの上書きは、子クラスにて新定義されたのと同じ扱い
class Oya{
private $price="100";
}
class Ko extends Oya{
private $price="50"; //子クラス$thisから見た場合、privateプロパティの上書きは、子クラスにて新定義されたのと同じ扱い
public function getPrice(){ // ゲッター
return $this->price;
}
}
$ko = new Ko();//子クラスのインスタンスオブジェクトを生成
echo '子クラスのインスタンスオブジェクトプロパティ' . $ko->getPrice(),PHP_EOL;
// 処理結果
// 子クラスのインスタンスオブジェクトプロパティ50
ケース3
・親クラスプロパティprivate
・子クラスプロパティprotected
→子クラスプロパティ
class Oya{
private $price="100";
}
class Ko extends Oya{
protected $price="50";
public function getPrice(){ // ゲッター
return $this->price;
}
}
$ko = new Ko();//子クラスのインスタンスオブジェクトを生成
echo '子クラスのインスタンスオブジェクトプロパティ' . $ko->getPrice(),PHP_EOL;
// 処理結果
// 子クラスのインスタンスオブジェクトプロパティ50
P … 子クラスインスタンス生成。親クラス内での$this
概要
「プロパティ」オーバライド
・子クラスのインスタンスを生成
・親クラス内での$thisの挙動確認
→ 親クラスのプロパティがprivateかどうかで結果が異なる
ケース1
・親クラスプロパティprotected
・子クラスプロパティprotected
→子クラスプロパティ
処理の流れ
1.$priceプロパティ … 子クラス 50(但し、親クラス内に限り100)
2.$ko->getPrice(); … まず子クラス内でメソッドを探す
3.存在しないので、親クラスのメソッドが実行される
4.return $this->price; … 親クラスプロパティを見に行くが、継承先で上書きされているため、50 が返る
class Oya{
protected $price="100";
public function getPrice(){ // ゲッター
return $this->price;
}
}
class Ko extends Oya{
protected $price="50";
}
$ko = new Ko();//子クラスのインスタンスオブジェクトを生成
echo '子クラスのインスタンスオブジェクトプロパティ' . $ko->getPrice(),PHP_EOL;
// 処理結果
// 子クラスのインスタンスオブジェクトプロパティ50
ケース2
・親クラスプロパティprotected
・子クラスプロパティpublic
→子クラスプロパティ
処理の流れ
1.$priceプロパティ … 子クラス 50(但し、親クラス内に限り100)
2.$ko->getPrice(); … まず子クラス内でメソッドを探す
3.存在しないので、親クラスのメソッドが実行される
4.return $this->price; … 親クラスプロパティを見に行くが、継承先で上書きされているため、50 が返る
class Oya{
protected $price="100";
public function getPrice(){ // ゲッター
return $this->price;
}
}
class Ko extends Oya{
public $price="50"; // プロパティをオーバーライド
}
$ko = new Ko();//子クラスインスタンスオブジェクトを生成
echo '子クラスインスタンスオブジェクトプロパティ(親クラスプロパティより取得)' . $ko->getPrice(),PHP_EOL;
echo '<br />子クラスインスタンスオブジェクトプロパティ(子クラスプロパティより取得)' . $ko->price,PHP_EOL;
// 処理結果
// 子クラスインスタンスオブジェクトプロパティ(親クラスプロパティを見に行くが、継承先で上書きされているため)50
// 子クラスインスタンスオブジェクトプロパティ(子クラスプロパティより取得)50
ケース3
・親クラスプロパティprivate
・子クラスプロパティprivate
→子クラスインスタンスオブジェクトプロパティを、親クラスプロパティから取得
処理の流れ
1.$priceプロパティ … 子クラス 50(但し、親クラス内に限り100)
2.$ko->getPrice(); … まず子クラス内でメソッドを探す
3.存在しないので、親クラスのメソッドが実行される
4.return $this->price; … 親クラスプロパティの100 が返る(子クラスで上書きされているが、privateが優先されるため継承されていない)
※親クラス内$thisから見た場合>子クラスのprivate上書きプロパティはないのと同じ(継承されずに、親クラスプロパティが優先される)
※親クラスのプロパティを取得しているわけではない。取得しているのは、あくまでも子クラスインスタンスオブジェクトプロパティ。ただ、参照取得する際、private優先のため、親クラスのプロパティから取得しただけ
class Oya{
private $price="100";
public function getPrice(){ // ゲッター
return $this->price;
}
}
class Ko extends Oya{
private $price="50";
}
$ko = new Ko();//子クラスインスタンスオブジェクトを生成
echo '子クラスのインスタンスオブジェクトプロパティ' .$ko->getPrice(),PHP_EOL;
// 処理結果
// 子クラスのインスタンスオブジェクトプロパティ100
ケース4
・親クラスプロパティprivate
・子クラスプロパティprotected
→「ケース3」と同じ
class Oya{
private $price="100";
public function getPrice(){ // ゲッター
return $this->price;
}
}
class Ko extends Oya{
protected $price="50";
}
$ko = new Ko();//子クラスインスタンスオブジェクトを生成
echo '子クラスのインスタンスオブジェクトプロパティ' . $ko->getPrice(),PHP_EOL;
// 処理結果
// 子クラスのインスタンスオブジェクトプロパティ100
ケース5
・親クラスプロパティprivate
・子クラスプロパティpublic
→子クラスインスタンスオブジェクトプロパティを、親クラスプロパティから取得
→子クラスインスタンスオブジェクトプロパティを、子クラスプロパティから取得
処理の流れ
1.$priceプロパティ … 子クラス 50(但し、親クラス内に限り100)
2.$ko->getPrice(); … まず子クラス内でメソッドを探す
3.存在しないので、親クラスのメソッドが実行される
4.return $this->price; … 親クラスプロパティの100 が返る(子クラスで上書きされているが、privateが優先されるため継承されていない)
5.$ko->price … 子クラスより取得
※親クラス内$thisから見た場合>子クラスのprivate上書きプロパティはないのと同じ(継承されずに、親クラスプロパティが優先される)
※取得しているのは、あくまでも子クラスインスタンスオブジェクトプロパティ。初めに親クラスプロパティから取得した子クラスインスタンスオブジェクトプロパティを、次に子クラスプロパティから取得しただけ
class Oya{
private $price="100";
public function getPrice(){ // ゲッター
return $this->price;
}
}
class Ko extends Oya{
public $price="50"; // プロパティを新定義(上書きしているが、親クラスプロパティがprivateのため、継承されてはいない)
}
$ko = new Ko();//子クラスインスタンスオブジェクトを生成
echo '子クラスインスタンスオブジェクトプロパティ(親クラスから取得)' . $ko->getPrice(),PHP_EOL;
echo '<br />子クラスインスタンスオブジェクトプロパティ(子クラスから取得)' . $ko->price,PHP_EOL;
// 処理結果
// 子クラスインスタンスオブジェクトプロパティ(親クラスから取得)100
// 子クラスインスタンスオブジェクトプロパティ(子クラスから取得)50
P … 子クラスインスタンス生成。親クラス内での$this … 2
概要
取得したプロパティが、クラスではなく、インスタンスオブジェクトに所属していることの確認
「プロパティ」オーバライド
・子クラスのインスタンスを生成
・親クラス内での$thisの挙動確認
→ 親クラスのプロパティがprivateかどうかで結果が異なる
ケース1
・親クラスプロパティprivate
・子クラスプロパティprivate
→子クラスインスタンスオブジェクトプロパティを、親クラスプロパティから取得
処理の流れ
1.$priceプロパティ … 子クラス 50(但し、親クラス内に限り100)
2.$ko->getPrice(); … まず子クラス内でメソッドを探す
3.存在しないので、親クラスのメソッドが実行される
4.return $this->price; … 親クラスプロパティの100 が返る(子クラスで上書きされているが、privateが優先されるため継承されていない)
※親クラス内$thisから見た場合>子クラスのprivate上書きプロパティはないのと同じ(継承されずに、親クラスプロパティが優先される)
※親クラスのプロパティを取得しているわけではない。取得しているのは、あくまでも子クラスインスタンスオブジェクトプロパティ。ただ、参照取得する際、private優先のため、親クラスのプロパティから取得しただけ
class Oya{
private $price="100";
public function getPrice(){ // ゲッター
return $this->price;
}
public function setPrice($price){ // セッター
$this->price = $price;
}
}
class Ko extends Oya{
private $price="50";
}
$ko1 = new Ko();//子クラスインスタンスオブジェクト1を生成
$ko2 = new Ko();//子クラスインスタンスオブジェクト2を生成
echo '<br />子クラスのインスタンスオブジェクト1プロパティ'.$ko1->getPrice(),PHP_EOL;
$ko1->setPrice(200);
echo '<br />子クラスのインスタンスオブジェクト1プロパティが、変更されたことを確認' . $ko1->getPrice(),PHP_EOL;
echo '<br />子クラスのインスタンスオブジェクト2プロパティは、変更されていないことを確認' . $ko2->getPrice(),PHP_EOL;
// 処理結果
// 子クラスのインスタンスオブジェクト1プロパティ100
// 子クラスのインスタンスオブジェクト1プロパティが、変更されたことを確認200
// 子クラスのインスタンスオブジェクト2プロパティは、変更されていないことを確認100