システム内の他のクラスと友達になるために、いくつかのクラスが必要です。この機能の欠如により、公開してはならないいくつかのメソッドを公開しました。その結果、私のチームのメンバーはコードをひどく醜い方法で実装し、混乱を引き起こします。
PHP 5.3で友情を定義する方法はありますか?
(私はhttp://bugs.php.net/bug.php?id=34044を知っています。簡単な解決策がない場合は、そこで投票することをお勧めします)。
システム内の他のクラスと友達になるために、いくつかのクラスが必要です。この機能の欠如により、公開してはならないいくつかのメソッドを公開しました。その結果、私のチームのメンバーはコードをひどく醜い方法で実装し、混乱を引き起こします。
PHP 5.3で友情を定義する方法はありますか?
(私はhttp://bugs.php.net/bug.php?id=34044を知っています。簡単な解決策がない場合は、そこで投票することをお勧めします)。
私は同じ機能を探していて、解決策を実装することができました。これを使用するには、クラス Friendship から派生させ、派生クラスのフレンドであるクラスを指定するだけです。ここで見つけることができます: http://rommelsantor.com/clog/2011/04/23/php-5-3-class-friendship-support
要するに、いいえ。一般的に受け入れられているアプローチは、ライブラリに対して開発する方法についてチームを教育するか、再設計することです。最初の解決策は、phpdoc でドキュメントを作成し、docbloc コメントで @visibility を使用して可視性を設定し、もちろん実際にクラスをドキュメント化することで、非常に簡単に実行できます。2 つ目は、もう少し詳細がわからないとコメントできません。
/**
* Some helper class for LibraryInterface
*
* ATTENTION!
* This class should not be used outside this package.
*
* @visibility package
* @package mypackage
*/
class Helper
{
public function doStuff()
{
/* does stuff */
}
}
/**
* Class for accessing some part of the library.
*
* @visibility public
* @package mypackage
*/
class LibraryInterface
{
public function doStuff()
{
$this->helper->doStuff();
}
}
「友達になる」とはどういう意味かわかりません。抽象クラスを使用できます。このクラスでは、新しいクラスでそのクラスを「実装」できます。または、クラスに他のクラスを拡張させ、メソッドや変数などをパブリックまたはプライベートではなく「保護」することができます。
チームが「悪くて醜い方法で」コードを実装する場合、より大きな問題が発生する可能性があります。