PHP5を入れたので、早速クラスによる実験を。
PHP5から静的メソッドはstaticとつけたり、public private protectedなどのアクセス修飾子なんかも増えました。
かなりJavaライクな書き方になりました。
そこで、public private protectedのそれぞれのメンバ変数を使用して、extendsしたクラスでそれぞれのメンバ変数の値を変えたらどうなるかという実験しました。
ちなみに
<td>
どこからでもアクセス可能(default)
</td>
<td>
定義したのクラスと、サブクラスでアクセス可能
</td>
<td>
定義したのクラス内部でのみアクセス可能
</td>
test.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
<?php
class testA
{
public $a = "a";
protected $b = "b";
private $c = "c";
public function __construct()
{
print "testA class construct";
}
public function getC()
{
print $this->c;
}
}
class testB extends testA
{
public function __construct()
{
$this->a = "a_testB";
$this->b = "b_testB";
$this->c = "c_testB";
print_r($this);
$this->getC();
}
/* サンプル getCをオーバーライドしてみた。
public function getC()
{
print $this->c;
}
*/
}
$testB = new testB();
?>
|
ソースを見てのとおりですが、testAクラスのメンバ変数a,b,cをextendsしたtestBクラスから値を書き換えるというものです。
これの実行結果が面白かった。以下のようになりました。
test.php実行結果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
testB Object
(
[ a ] => a_testB
[ b:protected ] => b_testB
[ c ] => c
[ c ] =>; c_testB
)```
なるほど、publicとprotectedに値を変更できるようです。
ただ、privateに関しては動作が若干違います。
エラーにはならないものの、c:privateってのとcっていうのが用意されてしまったみたいです。
ちなみに普通にtestBクラスで「print $this->c」ってやると「c_testB」が表示されてしまいます。
ただし、testAクラスで、プロパティcを表示するメソッドをかいておけば「c」と表示されるようです。
testBでオーバーライドしてそこのなかで「print $this->c」ってやると「c_testB」が表示されてしまいます。当たり前かw
ちょっとづつPHP5の機能を理解していこうと思います。
|