メソッド呼び出しについて
オブジェクト指向とは何かをもう少し正確にほのめかして、あなたの声明に1つの修正を加えます。あなたのコメントは次のとおりです。
「Time Class」で「GetTime」関数を実行します
これはちょっと正確であり、それについて詳しく説明すると、OOPが明確になる場合があります。この投稿の目的のために、次のように言い換えることができます。
$time に格納されているオブジェクトにバインドされた 'GetTime' メソッド (Time クラスで定義されている)を実行します。
違いを見ます?クラスから関数を呼び出すだけではなく、「クラスから処理命令を取得しますが、それらの命令をこの特定のオブジェクトにバインドしてから実行します。
細かい言葉のように聞こえるかもしれませんが、カプセル化を理解する上で重要です。クラスのオブジェクトはメソッド定義を共有しますが、データは共有しません。
オブジェクトは、基本的に次の 2 つのセットと考えることができます。
- 独自の個人データを保持するメモリのブロック
- そのデータへの特別なアクセス権を持つ一連のメソッドへのポインタ
(メソッドとデータとの関係の「特別な」性質は、暗黙的または明示的であり、それはあなた次第です)
この違いは、「メンバー変数」(「オブジェクト プロパティ」、「インスタンス変数 (別名 ivar)」、または類似の名前と呼ばれることもあります) を使い始めるとすぐにわかります。次のサンプル コードを検討してください。
class Person {
public $name;
public printName() {
echo $this->name;
}
}
$me = new Person();
$you = new Person();
$me->name = "Chris";
$you->name = "Alex";
$me->printName(); // "Chris"
$you->printName(); // "Alex"
これは、各オブジェクトがインスタンス変数用の独自のメモリを持っているという事実を強調しています。それらは、それらの変数の定義と、それらの変数を処理するために記述されたコードのブロックを共有します。
特別な変数$this
は、この回答での私の全体的な意図にとって特に興味深いものです。同じメソッド定義の同じ変数は、メソッドを呼び出すオブジェクトに応じて、実際には異なるオブジェクトを指します。
それにかんするnew
ここで、前の行にコメントが表示されます (に関して$time = new Time
):
クラスを呼び出してクラスを変数に設定する
私がそれを表現する方法は次のとおりです。
このクラスのインスタンスを作成し、$time を介してインスタンスにアクセスできるようにします
その言葉、インスタンスは、先に進む前にしっかりするための大きな概念になります。classを呼び出さず、 method を呼び出し、 (少なくとも PHP では) 変数の値をクラスに設定せず、変数の値をクラスのインスタンスを指すように設定します。インスタンスとオブジェクトという言葉を同じ意味で使う人もいますが、それは問題ありません。ただし、クラスという単語と同じ意味で使用しないでください。
技術的な話をしましょう:
演算子を使用するとnew
、技術的には、PHP に次の 2 つのことを行うように指示することになります。
- クラスで定義されたすべてのメンバー変数を正確に格納するのに十分な、新しいメモリを取得します
- その新しいオブジェクトで特別なメソッドを呼び出して、オブジェクトを初期化できるようにする
したがって、new
2 回呼び出すと、2 つのオブジェクトに十分なメモリが取得されます。PHP はクラス定義を使用して、割り当てるメモリの量を計算し、呼び出す特別なメソッドを見つけます。
その特別なメソッドは呼び出され__construct
、オブジェクトが作成されたときに呼び出されることが保証されており、その特別な$this
変数は光沢のある新しいメモリを指しています。使用方法のサンプルを次に示します。
class Foo {
private $createdTime;
public function __construct() {
$this->createdTime = time();
}
}
$myFoo = new Foo;
表示されていませんが、__construct()
が呼び出され、 の値$createdTime
が初期化されました。