17

PHPでコンストラクターがどのように機能するかについて少し混乱しています。

新しいオブジェクトをインスタンス化するときに呼び出されるコンストラクターを持つクラスがあります。

$foo = new Foo($args);

__construct($params)クラスで呼び出され、Foo適切な初期化コードを実行します。

ただし、クラスを使用して静的関数を呼び出すと、コンストラクターが再度呼び出されます。

$bar = Foo::some_function(); //runs the constructor from Foo

これにより、コンストラクターが実行され、新しいFooオブジェクトを作成するときにのみ意図したオブジェクト初期化コードが実行されます。

コンストラクターがどのように機能するかという点が欠けていますか?または__construct()、クラスを使用して静的関数呼び出しを行うときに実行されないようにする方法はありますか?

オブジェクトの初期化を行う代わりに、「factory」関数を使用する必要がありますか?もしそうなら、コンストラクターのポイントは何ですか?

::編集::ユーザーが写真をアルバムにアップロードできるフォーム(create_photo.php)と、アルバムを表示できる領域(view_photos.php)があります。フォーム送信時:

$photo = new Photo($_FILES['photo'], $_POST['arg1'], ect..);

Photoコンストラクターは、写真を作成して保存します。ただし、view_photo.phpでは、次のように呼び出します。

$photo = Photo::find_by_id($_POST['id']) //user-defined function to query database

これにより、Photoのコンストラクターが実行されます。

4

4 に答える 4

25

あなたの質問を再現するものは何もありません。

デモを参照してください:http://codepad.org/h2TMPYUV

コード:

class Foo {
    function __construct(){ 
        echo 'hi!';
    }
    static function bar(){
        return 'there';
    }
}

echo Foo::bar(); //output: "there"
于 2011-11-22T17:43:08.923 に答える
6

仮定 PHP 5.x

異なる目標、異なるパス

  1. クラス (オブジェクト) の新しいインスタンスを作成する

    class myClassA
    {
       public $lv;
    
       public function __construct($par)
       {
           echo "Inside the constructor\n";
           $this->lv = $par;
       }
    }
    
    $a = new myClassA(11);
    $b = new myClassA(63);
    

    新しいオブジェクト PHP 呼び出しを作成するためです。

    __construct($par);

    新しいオブジェクトの、そう:

    $a->lv == 11 
    
    $b->lv == 63
    
  2. クラスの関数を使用する

    class myClassB
    {
        public static $sv;
    
        public static function psf($par)
        {
            self::$sv = $par;
        }
    }
    
    myClassB::psf("Hello!");
    $rf = &myClassB::$sv;
    myClassB::psf("Hi.");
    

    $rf == "Hi."

    関数または変数は、によってアクセスされるように static を定義する必要があります::。「psf」を呼び出すオブジェクトは作成されません。「クラス変数」 svは、クラス内に 1 つのインスタンスしかありません。

  3. Factoryによって作成されたシングルトンを使用します(myClassAは上にあります)

    class myClassC
    {
    
        private static $singleton;
    
        public static function getInstance($par){
    
            if(is_null(self::$singleton)){
    
                self::$singleton = new myClassA($par);
    
            }
    
            return self::$singleton;
    
        }
    
    }
    
    $g = myClassC::getInstance("gino");
    echo "got G\n";
    
    $p = myClassC::getInstance("pino");
    echo "got P\n";
    

$parがginoに設定された新しいオブジェクトを初めて作成するときに、ファクトリ ( getInstance ) を使用します。

ファクトリを 2 回目に使用すると、$singletonには既に返される値があります。新しいオブジェクトは作成されません ( __constructは呼び出されず、使用されるメモリと CPU は少なくなります)。

もちろん、値はオブジェクトinstanceOf myClassA であり、忘れないでください。

myClassC::$singleton->lv == "gino"

シングルトンに注意してください:

シングルトンの何がそんなに悪いのですか?

http://www.youtube.com/watch?v=-FRm3VPhseI

私の答えでは、シングルトンを昇格/降格したくありません。質問の言葉から単純に、私はこの計算を行いました:

"static"+"__construct"="singleton"!

于 2011-11-22T19:14:22.477 に答える