7

変数のカプセル化、Set / Getメソッドはベストプラクティスですが、とにかく使用することを意図していないのに、なぜ変数をpublicと宣言する機会があるのでしょうか。私が読んだすべてのチュートリアルでは、変数をset / getメソッドでカプセル化する必要があると書かれているので、変数がデフォルトで常にプライベートであり、パブリックになる可能性がない場合は、もっと良かったでしょうか。少なくともPHPOOPでパブリック変数の有効なユースケースはありますか?

4

3 に答える 3

8

実際、それは逆です。理論的には、ゲッター/セッターは間違っています。プロパティはオブジェクトの状態を定義し、メソッドは動作を定義します。ゲッター/セッターは、プロパティへの読み取りおよび書き込みアクセスのみをインターセプトしますが、セマンティックの意味を完全に破壊します。オブジェクトのステータスの読み取りは、オブジェクトの動作です。

プロパティを再びプロパティのように見せるために、RFCがあります:) https://wiki.php.net/rfc/propertygetsetsyntax

于 2012-04-20T11:32:26.357 に答える
1

Set / Getメソッドはベストプラクティスですが、とにかく使用することを意図していないのに、なぜ変数publicを宣言する機会があるのでしょうか。

使用することを意図していないベストプラクティスは同じではありません。言語は、さまざまなユースケースに応じてさまざまなツールを提供する必要があり、一貫している必要があります。

PHPオブジェクトは常にパブリックメンバーをサポートしており、差別化された可視性が導入された場合、下位互換性のある理由から、パブリックメンバーは非常に便利です。

私が読んだすべてのチュートリアルでは、変数をset / getメソッドでカプセル化する必要があると書かれているので、変数がデフォルトで常にプライベートであり、パブリックになる可能性がない場合は、もっと良かったでしょうか。

その質問に具体的に答えることはできません。主観的すぎて、さまざまなユースケースが多すぎて、さまざまな答えが得られます。

少なくともPHPOOPでパブリック変数の有効なユースケースはありますか?

後方互換性から始めます。コードをリファクタリングできないが、常に完全に書き直す必要がある場合、これは非常にコストがかかります。

于 2012-04-20T11:35:14.313 に答える
-1

見てみましょう..これはCakePHPEmailComponentの実際のEメールAPIクラスです。このクラスを使用するには、いくつかのプロパティを「設定」するだけで済みます。send()

$this->Email->to = 'ss@b.co';
$this->Email->from = 'me@b.co';
$this->Email->title = 'xxx';
$this->Email->msg = 'blabla..';
$this->Email->send();

実際、このクラス内には多くのプライベートプロパティと関数がありますが、プライベートです。

クラスには、何かをする(単一の)責任があります。 カプセル化とは、人々がそのことを行うために使用するものだけを公開し、技術/インフラストラクチャを非公開として内部に保持することです。

于 2012-04-20T11:54:42.053 に答える