0

データ マッピング パターンを使用する際のベスト プラクティスは、どのような可視性で得られるのでしょうか?

プライベート/パブリック/保護

保護されている場合、マッパー クラスの save() メソッドで getters() を使用する必要があります。

プライベートとパブリックの場合、 $user->id; を実行できます。マッパークラスで。最も理にかなっていることは何ですか?

4

1 に答える 1

0

私の意見では、このようによく使用します。プロパティは保護されており、私のクラスはゲッターとセッターに魔法のメソッドを使用しています。私のやり方では、あなたは両方を行うことができます。setter-methods の使用について私が気に入っている最も良い点は、流暢なインターフェースを使用していることです。

/**
 * Handling non existing getters and setters
 *
 * @param string $name
 * @param array $arguments
 * @throws Exception
 */
public function __call($name, $arguments)
{
    $type = substr($name, 0, 3);

    // Check if this is a getter or setter
    if (in_array($type, array('get', 'set'))) {
        $property = lcfirst(substr($name, 3));

        // Only if the property exists we can go on
        if (property_exists($this, $property)) {
            switch ($type) {
                case 'get':
                    return $this->$property;
                    break;

                case 'set':
                    $this->$property = $arguments[0];
                    return $this;
                    break;
            }
        } else {
            throw new \Exception('Unknown property "' . $property . '"');
        }
    } else {
        throw new Exception('Unknown method "' . $name . '"');
    }
}

/**
 * Magic Method for getters
 *
 * @param string $name
 * @return mixed
 */
public function __get($name)
{
    $method = 'get' . ucfirst($name);
    return $this->$method();
}

/**
 * Magic Method for setters
 *
 * @param string $name
 * @param mixed $value
 */
public function __set($name, $value)
{
    $method = 'set' . ucfirst($name);
    return $this->$method($value);
}

流れるようなインターフェイスを使用すると、次のようになります。

$post->setTitle('New Post')
     ->setBody('This is my answer on stackoverflow.com');

単一の可能性に関するいくつかの考え:

プライベート

プライベート プロパティを使用すると、モデル クラスを拡張して一部の機能を再利用できなくなります。

公衆

変数への変更を傍受する方法はありません。設定で何かをする必要がある場合があります。

保護された

私にとって最良の方法です。プロパティは公に変更可能ではないため、他の開発者に、追加機能を持つプロパティのゲッターとセッターを作成するように強制しています。また、私の意見では、このようにして、他の人がモデルクラスを誤用するのを防ぐことができます。

于 2012-12-08T18:24:00.780 に答える