この質問の形式で何かを試すつもりです。それを処理するためのより良い方法についての提案を非常に歓迎しています。
質問で大量のコードをダンプしたくなかったので、クラスのコードを に投稿しましたrefactormycode
。
私の考えでは、人々はここにコード スニペットを投稿するか、変更を加えrefactormycode
てリファクタリングへのリンクを投稿することができます。それに基づいて、賛成票を投じて回答を受け入れます(明確な「勝者」がいると仮定します)。
とにかく、クラス自体に:
getter/setter クラス メソッドについて多くの議論が見られますが、単純なプロパティ変数に直接アクセスする方がよいのでしょうか、それともすべてのクラスに明示的な get/set メソッドを定義する必要があるのでしょうか。後でロジックを追加する必要がある場合に備えて、明示的なメソッドを用意するというアイデアが気に入っています。その後、クラスを使用するコードを変更する必要はありません。ただし、次のような関数が何百万もあるのは嫌いです。
public function getFirstName()
{
return $this->firstName;
}
public function setFirstName($firstName)
{
return $this->firstName;
}
今、私はこれを行う最初の人ではないと確信しています (誰かが私に提案できるより良い方法があることを願っています)。
基本的に、PropertyHandler クラスには __call マジック メソッドがあります。"get" または "set" で始まる __call を経由するすべてのメソッドは、値を連想配列に設定または取得する関数にルーティングされます。配列のキーは、取得または設定後の呼び出しメソッドの名前です。したがって、__call に入るメソッドが「getFirstName」の場合、配列キーは「FirstName」です。
サブクラスにすでに「getFirstName」メソッドが定義されている場合に自動的に処理されるため、__call を使用するのが好きでした。私の印象 (間違っているかもしれません) は、__get & __set マジック メソッドはそれを行わないということです。
したがって、これがどのように機能するかの例を次に示します。
class PropTest extends PropertyHandler
{
public function __construct()
{
parent::__construct();
}
}
$props = new PropTest();
$props->setFirstName("Mark");
echo $props->getFirstName();
PropTest には実際には「setFirstName」または「getFirstName」メソッドがなく、PropertyHandler もないことに注意してください。配列の値を操作しているだけです。
もう 1 つのケースは、サブクラスが既に何か他のものを拡張している場合です。PHP では真の多重継承を行うことができないため、サブクラスに PropertyHandler インスタンスをプライベート変数として持たせることができます。もう 1 つ関数を追加する必要がありますが、その後はまったく同じように動作します。
class PropTest2
{
private $props;
public function __construct()
{
$this->props = new PropertyHandler();
}
public function __call($method, $arguments)
{
return $this->props->__call($method, $arguments);
}
}
$props2 = new PropTest2();
$props2->setFirstName('Mark');
echo $props2->getFirstName();
サブクラスには、PropertyHandler __call メソッドにすべてを渡すだけの __call メソッドがあることに注意してください。
このように getter と setter を処理することに対するもう 1 つの良い議論は、文書化が非常に難しくなるということです。
実際、文書化されていない明示的なメソッドが存在しないため、どのような種類の文書生成ツールを使用することも基本的に不可能です。
私は今のところ、このアプローチをほとんど放棄しました。興味深い学習課題でしたが、明快さを犠牲にしすぎていると思います。