2010-11-28 8 views
1

こんにちは。共通または正しい構造と考えられる以下の2つのOOPの例の目的を超えて見ていますか?それとも単に好みですか?これらのPHP OOPの例のどれがPHP OOP構造の「共通の」実践ですか?

例1:

class names 
{ 
    private $first_name; 

    public function setUpperCase($first_name) 
    { 
     $this->first_name = ucfirst($first_name); 
    } 

    public function viewUpperCase() 
    { 
     echo $this->first_name; 
    } 

}

$names = new names(); 
$names->setUpperCase("jimbo"); 
$names->viewUpperCase(); 

例2:

class names 
{ 
    public function setUpperCase($first_name) 
    { 
     $upper_first_name = ucfirst($first_name); 

     return $upper_first_name; 
    } 

    public function viewUpperCase($upper_first_name) 
    { 
     echo $upper_first_name; 
    } 
} 

$names = new names(); 
$uppercase = $names->setUpperCase("jimbo"); 
$names->viewUpperCase($uppercase); 

最初の例では、クラス構造内の変数を設定します。 2番目の例では、変数をメソッド引数として設定しています。どちらもまったく同じことです。しかし、それは「適正」ですか?

ありがとうございます。 乾杯!

+0

これは、あとでそのクラスインスタンス内で$ upper_first_nameの値を必要とするかどうかによって異なりますか? – o01

+0

確かに。しかし、もしこれがクラス全体だったら?スクリプトの「目的」を考えずに、2つの例のどちらが「共通」な構造ですか? – Tableking

答えて

0

私は手足の外に出て、最初の例がオブジェクトとして定義されている "正しい"方法であると言うのは、プロパティによって定義されています。 大文字のメソッドなど、特定の変更を適用できる名前を持つユーザークラスの初めがあるようです。 2番目の例は、単にユーティリティである可能性があり、実際のオブジェクトとして記述するつもりはありません。

7

私の提案

class Name 
{ 
    protected $firstName; 

    public function __construct($firstName) 
    { 
     $this->firstName = $firstName; 
    } 

    public function getUpperCase() 
    { 
     return ucfirst($this->firstName); 
    } 
} 

$name = new Name('jimbo'); 
echo $name->getUpperCase(); 
+0

+1確かに最もクリーンな方法です。これは受け入れられるべきです! –

0

彼らはまったく同じことをしない、その結果、それは好みの問題ではありません。最初の例は大文字のファイル名をオブジェクトに格納し、2番目のファイルは大文字ではありません。あなたが望む/必要とするのは状況に依存します。

0

最初のコードセグメントが正しいです。あなたの例は、実際にOOPの真の本質をカプセル化しているわけではありません。

オブジェクトには属性とメソッドがあります。属性はオブジェクトに関する情報を格納し、メソッドはこの情報を変更します。最初のサンプルは、名前を属性として保存することでこれを行います。どのメソッドが呼び出されても、firstname属性はクラス全体で保持されます。

2番目の例では、属性を宣言していません。独自のデータを扱う無関係な2つのメソッドがあります。メソッドの外に、あなたの属性値は存在しません。

もう1つの方法は、姓属性とgetFullName()メソッドを追加する場合です。例1は、これを非常に簡単に許可します。例2

class names 
{ 
    private $first_name; 
    private $surname; 

    public function getFullName() 
    { 
     return $this->first_name . ' ' . $this->surname; 
    } 

    public function setUpperCase($first_name) 
    { 
    $this->first_name = ucfirst($first_name); 
    } 

    public function viewUpperCase() 
    { 
    echo $this->first_name; 
    } 
} 

$names = new names(); 
$names->setUpperCase("jimbo"); 
$names->viewUpperCase(); 

正しい戻り値を得るためにgetFullName()メソッドの中に両方の名前を渡す必要があると思いますので、これは不自然になります。これは、すべてのデータと関連する操作を格納するエンティティを意味するオブジェクトを作成する目的を破ります。例2では、​​データのみを格納するのではなく、操作のみを格納します。

+0

おそらく姓が冗長なのでコンストラクタを利用していますか? – RobertPitt

0

OOPの主な原則はです。再利用可能なコードですので、コードを何度も再利用できるはずのユーザー用のクラスを作成してください。

すべてのオブジェクトは、ほとんどの場合、私は以下の言いたいことの例エンティティにユニークです:あなたは、コンストラクタで識別に渡す必要があり、そうuserはそうのようになるオブジェクトで

class  identification 

User  user id 
Curl  Web Address 
Logger Log File 

コンストラクタを使用しているため、各クラスは識別子の専用として1回しか作成できないためです。

ユーザークラスでは、そのようなメソッドを作成することができるだろう:私は確かに私には、このよう Philippe Gerberのethodに取ると、あなたのクラスに固有の点で

public function addFriend(User $User) 
{ 
    //Insert into the database with $User->getID(); 
} 

$Robert->addFriend($Peter); 

が標準です。

Philippe Gerberの方法では、変数を大文字に変更することはありませんが、大文字の文字列を返すことはありません。その理由は、実行時に文字列を返すと、プロセスの後半で期待どおりに動作しない可能性があります。

変数データが​​データベースまたはファイルに複製されている場合にのみ、変数データを変更する必要があります。したがって、スクリプトがどのようなものになるのかは関係ありません。