初書:2020/11/4
php:7.4.10
前書き
オブジェクトを使う際にほぼ間違いなく使うprivate。
今回は(個人的に)意外な性質を見つけたのでメモ。
コード
先にコードを提示
class tes{
private int $a = 1232;
private function fc():int{
return $this->a;
}
public function func(tes $val) : int
{
return $val->fc() + 158;
}
}
$a = new tes();
$b = new tes();
var_dump($b->func($a));
数字・関数名変数名は適当。
いや今気がついたけどこのコードだとfcの定義している意味が完全に無いじゃん。
まぁ支障はないので一旦放置。
簡単にコードの説明をしておくと、private変数$a
を用意しておき、fc
関数で取得可能。
またfunc
関数では、tesクラスのインスタンスを引数とし、fc
関数と158を足した値を戻す。
そして2つのインスタンスを生成し、片方のインスタンスを引数にもう片方のfunc
を呼ぶというもの。
さて、上記コードを実行してみるとどうなるか。
php > var_dump($b->func($a));
int(1390)
普通に実行できる。
何が言いたいのか
つまり、privateな関数や変数1であっても、同じクラス内から呼び出す分には別のインスタンスであっても呼び出すことが可能である。(初知り)
javascriptでも試してみる。
class tes{
#a = 1232;
#fc(){
return this.#a;
}
func(val){
return val.#fc() + 158;
}
}
a = new tes();
b = new tes();
console.log(b.func(a));
(ちなみに#
から始まるのをフラグメント演算子というらしいのだが、いつから実装されてるのか不明。2)
さて、結果はどうなったのか。ちなみにページを用意するのが面倒だったので、コンソールに投げて実行した。
safari
ver 14.0
SyntaxError: Invalid character: '#'
そもそもフラグメント演算子に対応していない
chrome
ver 86.0
1390
phpと同様の結果に。
Firefox
ver 82.0
Uncaught SyntaxError: private fields are not currently supported
認識はするものの対応自体はしていない模様
結果
phpと同じと認識してもいいと思われる
C#でも試す。
C#というよりunity。
using UnityEngine;
public class test2 : MonoBehaviour{
void Start(){
var a = new tes();
var b = new tes();
print(b.func(a));
}
}
class tes{
private int a = 1232;
private int fc(){
return a;
}
public int func(tes val){
return val.fc() + 158;
}
}
普通に1390と出た。
結論
もしかして単純に無知を晒した投稿なのでは?(今更。でも書いてしまった)
「privateは1カプセル毎に個別で持つもの、外部からは一切アクセスできない」という認識があったので少し意外な処理だった。