-1

私はOOP以外のPHPにかなり精通しています-私は今飛び込み始めています。

私はビデオを見たり、チュートリアルを読んだりしてきましたが、それでもかなり混乱しています...

私が持っている場合

ファイル 1 (class.time.php)

class Time {
    function GetTime(){
        $time = date('H:i:s');
        printf($time);
    }
}

そして、私が持っている別のphpページで

ファイル 2 (page.php)

できます

include('class.time.php');

そして、このページのどこでもできる

$time = new Time; //Calling the class and setting the class to a variable
$time->GetTime(); //This is BASICALLY saying (run the 'GetTime' function in the 'Time Class'

私の主な質問は、上記のコメント(これは基本的に言っています.....)は正しいですか?またはそれを考えるより良い方法はありますか?

4

5 に答える 5

6

メソッド呼び出しについて

オブジェクト指向とは何かをもう少し正確にほのめかして、あなたの声明に1つの修正を加えます。あなたのコメントは次のとおりです。

「Time Class」で「GetTime」関数を実行します

これはちょっと正確であり、それについて詳しく説明すると、OOPが明確になる場合があります。この投稿の目的のために、次のように言い換えることができます。

$time に格納されているオブジェクトにバインドされた 'GetTime' メソッド (Time クラスで定義されている)を実行します。

違いを見ます?クラスから関数を呼び出すだけではなく、「クラスから処理命令を取得しますが、それらの命令をこの特定のオブジェクトにバインドしてから実行します。

細かい言葉のように聞こえるかもしれませんが、カプセル化を理解する上で重要です。クラスのオブジェクトはメソッド定義を共有しますが、データは共有しません

オブジェクトは、基本的に次の 2 つのセットと考えることができます。

  1. 独自の個人データを保持するメモリのブロック
  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 つのことを行うように指示することになります。

  1. クラスで定義されたすべてのメンバー変数を正確に格納するのに十分な、新しいメモリを取得します
  2. その新しいオブジェクトで特別なメソッドを呼び出して、オブジェクトを初期化できるようにする

したがって、new2 回呼び出すと、2 つのオブジェクトに十分なメモリが取得されます。PHP はクラス定義を使用して、割り当てるメモリの量を計算し、呼び出す特別なメソッドを見つけます。

その特別なメソッドは呼び出され__construct、オブジェクトが作成されたときに呼び出されることが保証されており、その特別な$this変数は光沢のある新しいメモリを指しています。使用方法のサンプルを次に示します。

class Foo {
 private $createdTime;
 public function __construct() {
  $this->createdTime = time();
 }
}

$myFoo = new Foo;

表示されていませんが、__construct() 呼び出され、 の値$createdTimeが初期化されました。

于 2012-09-01T03:36:34.280 に答える
0

私の意見では、あなたはそれを正しくやっていますが、単純な組み込みの日付関数を使用する場合、クラスを介して使用すると、おそらく複雑になります。

以下は、初心者向けの PHP PHP OOP で OOP を学習するための優れた記事 です。

于 2014-10-27T07:25:55.430 に答える
0

それは正しいですが、構文は次のようにする必要があります。

$time = new Time();
$time->GetTime();

(かっこを忘れないでください。そうしないと、クラス プロパティを参照していることになります)

また、メソッドを public、protected、または private として宣言することをお勧めします。クラスの外部から GetTime メソッドを呼び出す場合は、パブリックにする必要があります。

于 2012-09-01T03:17:47.050 に答える
0

はい、基本的にあなたの仮定は正しいです(構文エラーは別として)。

しかし、それはあまり良い OO 設計ではありません。

これを見てください。OO 設計の良い例がいくつか示されています: http://www.math-cs.gordon.edu/courses/cs211/ATMExample/

于 2012-09-01T03:18:02.680 に答える
0

この場合、「get time」は決して変更されず、パラメーターを受け入れないため、これを静的メソッドに入れるのが最善です。この状況でクラスをインスタンス化するのは無駄だからです。

例えば:

class Time {
    static public function GetTime(){
        $time = date('H:i:s');
        printf($time);
    }
}

Time::GetTime(); // gets the time, no need to do $time = new Time();
于 2012-09-01T03:39:00.637 に答える