2017-09-13 18 views
0

__construct()は理解できません。私はこの二つの例の違いを見ることができない。2つのクラスの違い__construct()

1)

class Person { 

public function __construct($person) { 
    echo $person; 
} 

$person = new Person('Name'); 

2)この不自然な例で

class Person { 
    public function name($name) { 
     echo $name; 
    } 
} 

$person = new Person(); 
$person->name('Name'); 
+3

マニュアル:[コンストラクタとデストラクタ](http://php.net/manual/en/language.oop5.decon.php) –

+1

コンストラクタは、オブジェクトを作成する際に最初に必要な動作を定義するだけです。 – Kazz

+0

違いを見ることはできませんか? 1つは構築時に引数を渡し、もう1つは後で別のインスタンスメソッドに渡します。かなり明確な違いはIMO。なぜそれが違うと思うのかを明確にしたいかもしれません。 – deceze

答えて

2

あなたの2つの例は、実際には同等のように見えるかもしれませんが、単一の(あなた、今、現在の)パースペクティブからしか見えません。この例では

class Person { // First case : using the constructor 

    public function __construct($person) { 
     echo $person; 
    } 
} 

// ---------------------------------------------------------------- 
$person = new Person('Name'); 


は、あなたはそれが非常に明確なクラス Person(またはそのサブクラスの1つ) のそれぞれとすべてのオブジェクトがとすぐに、それが作成される名前を与えなければならないことを確認してください。いつでも名前のない Personはありません。これは、ある意味でコードを共有している場合には、自分自身に課した設計上の制約です(クラス Personのオブジェクトを作成する場合)。この制約に違反しようとすると、PHPは明示的なエラー/警告メッセージとともにハングします。 (デモ: https://3v4l.org/hCXZ8


class Person { // Second case : no constructor (equivalent to an empty constructor) 

    public function name($name) { 
     echo $name; 
    } 
} 

// ---------------------------------------------------------------- 
$person = new Person(); 
$person->name('Name'); 

これは、異なる獣です:あなたは、クラスPersonのオブジェクトを作成することができ、あなたが名前を表示することができます。 Personを作成して、名前をまったく表示することもできません。何らかの理由でクラスコードに目を向けることができない場合は、実際にはできることは分かりません(各クラスに個別のファイルを与えるのが一般的です)。両方の例で


これらは、2つの異なる視点(彼らも互いに通信することができない二つの異なる人々ことができると思います)ですので、私は、クラス宣言と使用の間にコメント行を描きました。クラス作成者として、制約を厳密にあなたが生成できる最も明白なコードに変換します。クラスユーザーは、使用しているクラスの複雑さを理解するのに時間を浪費したくなくても構いません。複雑さを最小限に抑えながらオブジェクトを作成し、最小のオーバーヘッドと学習曲線で機能を活用し、ビジネスと

4

、第二は結構です。

nameがechosのメソッドではなく、クラスのフィールドだった場合はどうなりますか?あなたが明示的にそれを設定する前に、それはどんな価値がありますか?

フィールドが初期化され、オブジェクトが使用可能になる前にセットアップが行われるようにするには、コンストラクタを使用します。初期化を必要としない場合は、必ずしも明示的なコンストラクタを書く必要はありません。

+0

ええと。私は今それを理解していると思います....しかし、私はあなたがそれをよりよく理解するための小さな例を書いておきたいと思っています。どうもありがとうございます! –

+0

@ΜάνοςΑρβανίτης私はしばらくのうちにPHPを書いていないので、コードを書くことを避けることを望んでいました。私は状況をさらに混乱させるために私が紹介した間違いを望んでいません。あなたはオブジェクトの使用と作成をどれだけ勉強しましたか?あなたが始めているのであれば、コンストラクタの目的は明白ではないかもしれません。より複雑なオブジェクトを書き始めるとすぐに、より明確になるはずです。投稿したサンプルの問題は、最初にクラスを使用することに意味がないことです。この方法は、裸の機能でもよい。 – Carcigenicate

+0

最初にクラスを誤って使用しているコードからクラスの操作に関する結論を導くことは役に立たない。 – Carcigenicate