1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

privateの想像と違う(?)動作のお話

Posted at

初書: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カプセル毎に個別で持つもの、外部からは一切アクセスできない」という認識があったので少し意外な処理だった。

  1. 上記コードでは出てこないが、$val->fc()$val->aに変えても実行できる

  2. ここのサイトにて、node.jsのv12からという記述は確認。

1
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?