概要
コードサンプル:
Class People {
// private property.
private $name;
// other methods not shown for simplicity.
}
まっすぐ進む。$name
それがPRIVATEクラスのメンバー(またはプロパティ、変数、フィールド、必要に応じて呼び出す)であると仮定します。PHPでこれらを行う方法はありますか?
$someone = new People();
$someone->name = $value;
$somevar = $someone->name;
およびを使用__get($name)
せずに__set($name, $value)
。
バックグラウンド
割り当てられたものを確認する必要があった$value
ため、次のようなゲッターセッターが必要です。
getName();
setName($value);
そして、必ずしもこのようにオーバーロードするゲッターセッターマジックメソッドではありません:
__get($value);
__set($value, $name);
そうは言っても、私は単にゲッターセッターが必要です。しかし、それは私が望んでいることではありません。C ++やC#などの静的型付け言語の人々は、私と同じように感じるかもしれないので、オブジェクト指向のようには感じられません。
getter setterのマジックメソッドのオーバーロードを使用せずに、C#のようにPHPでプライベートプロパティを取得および設定する方法はありますか?
アップデート
なぜ魔法の方法ではないのですか?
マジックメソッドは明示的なゲッターセッターメソッドよりも10倍遅いという噂がウェブ上に浮かんでいます。私はまだテストしていませんが、覚えておくとよいでしょう。(それほど遅くはなく、2倍遅いことがわかりました。以下のベンチマーク結果を参照してください)
明示的なゲッターセッターのようにプロパティごとに異なる関数に分割するのではなく、マジックメソッドを使用する場合は、すべてを1つの巨大なメソッドに詰め込む必要があります。(この要件はircmaxellによって回答された可能性があります)
パフォーマンスオーバーヘッドベンチマーク
マジックメソッドと明示的なゲッターセッターを使用する間のパフォーマンスのオーバーヘッドに興味があるので、両方のメソッドに対して独自のベンチマークを作成しました。これを読んだ人に役立つことを願っています。
魔法のメソッドとmethod_existを使用する場合:
(コードを表示するには、ここをクリックしてください)
- ゲッターのコストは0.0004730224609375秒です。
- セッターのコストは0.00014305114746094秒です。
明示的なゲッターセッターを使用する場合:
(コードを表示するには、ここをクリックしてください)
- ゲッターのコストは0.00020718574523926秒です。
- セッターの費用は7.9870223999023E-5秒(0.00007xxx)です。
とは言うものの、魔法のメソッドとメソッドを備えたセッターとゲッターの両方が、明示的なゲッターセッターの2倍のコストで済みます。中小規模のシステムでも問題ないと思います。