2017-10-21 2 views
-1

私を助けてください。 PHP OOPの原則をよりよく理解する必要があります。PHPでクラスとプロパティを整理するのは正しいですか?

私はそれがstaticとして定義されるべきクラスのすべてのインスタンスに対して不変であるクラスのプロパティを持っている場合は? その場合、そのタイプのすべてのクラスで静的プロパティが定義されていることを確認する方法はありますか?私がPHPマニュアルで読んでいるように、静的プロパティは、インタフェースや抽象クラスのどちらでも制御できません。または私は間違っていますか?

単純な例です。

<?php 

// Parent class 
abstract class Employee 
{ 
    abstract public function getAlias(); 
} 

// Child classes 
class Manager extends Employee 
{ 

    public function getAlias() 
    { 
     return 'manager'; 
    } 
} 
class Security extends Employee 
{ 
    public function getAlias() 
    { 
     return 'security'; 
    } 
} 

aliasプロパティはどこに配置する必要がありますか教えてください。 将来作成される従業員の子孫には、そのプロパティが定義されていることを確認する必要があります。ダイナミックメソッドにそのようなプロパティを保持することはOKですか?または、定数、静的メソッドまたは静的プロパティに配置する必要がありますか?それは近いprinciple of least astonishmentと一致することから、それは、クリーンなコードになりので

+0

あなたがのためにエイリアスを使用するものを、少し説明できますか?検索DBレコードエイリアスに基づいて適切なクラスをインスタンス化 - 例えば、 'alias'性(限り任意の同様のもの)について – Gordon

+0

は、DBテーブルに格納され、単一表の継承のために使用することができます。 – Roman

+0

この場合、エイリアスではなく実際のクラス名を使用できます。 'Manager :: class'はあなたに完全修飾クラス名を与えます。また、あなたのORMがそれを処理してはいけませんか?私を間違えないでください。それは有効な質問です。代わりに型チェックをすることができます。しかし、それはいくつかの文脈を必要とすることを決定する。 – Gordon

答えて

0

実は現在のバージョンは(なしコンテキストと見なされている場合)は非常にokです。技術的に、あなたはこのようにそれを書き換えることができ(それが実際にコードそれがさらに悪化するだろう):

abstract class Employee { 
    public function getAlias() { 
     return $this->alias; 
    } 
} 

class Manager extends Employee { 
    protected $alias = 'mngr'; 
} 


$user = new Manager; 
echo $user->getAlias(); 

ライブコード:https://3v4l.org/sjVOT

より多くの重要な側面は、このコードの目的です。あなたは、単一テーブル継承を扱うため、このようなものを使用したいと思うことを、述べたが、ここで重要な部分である:

あなたのドメインエンティティを永続化層がをどのように動作するかを認識するべきではありません。

そして、いくつかのクエリビルダで使用するためのドメイン層から構造情報を引っ張ってはひどいアイデアです。代わりにdata mapperパターン(実際にはPoEAA本を読んでください)をご覧になることをお勧めします。

あなたのドメインエンティティは、彼らが保存または復元されているか(あるいは「場合」)についての詳細を知るべきではありません。

関連する問題