PHPのpublic, protected, privateによるクラス変数の挙動について
以下がテストコード。
Mainクラスでそれぞれ$public, $protected, $privateを定義。
また、mainSetVal()というメソッドがある。
SubクラスはMainクラスを拡張したもの。
SubクラスはsubSetVal()というメソッドを追加した。
$instanceはsubクラスのインスタンス。
<?php //test private protected
class Master
{
public $_public;
protected $_protected;
private $_private;
function masterSetVal ($val) {
$this->_public = $val;
$this->_protected = $val;
$this->_private = $val;
}
}
class Sub extends Master {
function subSetVal ($val) {
$this->_public = $val;
$this->_protected = $val;
$this->_private = $val;
}
}
$instance = new Sub();
/**
* use Master's method
*/
echo "-------------------------------------------------- masterSetVal\n";
$instance->masterSetVal("master");
var_dump($instance);
/**
* use Sub's method
*/
echo "-------------------------------------------------- subSetVal\n";
$instance->subSetVal("sub");
var_dump($instance);
で、結果がこれ。
-------------------------------------------------- masterSetVal
object(Sub)#1 (3) {
["_public"]=>
string(6) "master"
["_protected:protected"]=>
string(6) "master"
["_private:private"]=>
string(6) "master"
}
-------------------------------------------------- subSetVal
object(Sub)#1 (4) {
["_public"]=>
string(3) "sub"
["_protected:protected"]=>
string(3) "sub"
["_private:private"]=>
string(6) "master"
["_private"]=>
string(3) "sub" // public変数として増えてる。
}
子クラス内で、まぁpublicは変更されるとして
protectedはextendsしてるからこれもクラス内利用であれば変更されて
privateはMasterクラスでしか変更できない。しかもその場合子クラスにはpublicの変数があてられるので注意。
とりあえずPHPはインスタンスになるとなかなか拡張できないことがわかりやした。
- 拡張はクラスのextendsでサブクラスを作る。
- インスタンスにしたら基本オプション的な数値のみ変える。
ってことでいいのかな?
なんかなー、多重継承が気持ち悪い。たどるの大変。
function Class (){
this.hello = "world";
this.method = function () {
alert(this.hello);
}
}
var instance = new Class();
instance.method2 = function () {
alert("method2");
}
instance.method();
instance.method2();
JavaScriptってやっぱこういうとこ良いよね。
関係ないけどビデオは涼宮ハルヒの憂鬱。
これさ、公式なんだってさ。ネットで著作権だなんだとか言ってるなか逆に公開していくスタイルはかっこいいと思う。それが成功するかはしらないけど。
テレビに対してネットがやった事は、絵に対して写真がやったようなもの。
残酷だけど、音楽業界もテレビ業界も、そのときになったらそのときの立ち振る舞いが有るのだと思う。
それはネットも同じ。