2016-09-06 4 views
-1

を経由して、クラスの静的プロパティを設定します。私は現在、次のコードを持っている:私は構造を通して私のデータベース接続を使用してクラスのプロパティを設定しようとしているは、構造

class User { 
    private static $_db; 

    public function __construct() { 
     self::$_db = Database::getInstance()->getConnection(); 
    } 

    public static function addUser ($name, $username, $password) { 
     // Define Values 
     $name = ucwords(trim($name)); 
     $username = strtolower(trim($username)); 
     $password = password_hash($password, PASSWORD_BCRYPT); 

     // Define Query 
     $query = "INSERT INTO `users` (name, username, password) VALUES(:name, :username, :password)"; 

     // Prepare Query 
     $preparedQuery = self::$_db->prepare($query); 

     // Execute Query 
     $preparedQuery->execute([ 
      ':name' => $name, 
      ':username' => $username, 
      ':password' => $password 
     ]); 
    } 
} 

を。問題は、を呼び出すだけで、スクリプトの任意の場所にあるaddUser()メソッドにアクセスできるようにしたいということです。コンストラクトを介して静的プロパティを設定する方法はありますか、それとも私のデータベースにアクセスするより良い方法がありますか?

+0

スタティックステートをセットアップするのになぜコンストラクタを使用しますか? – tkausl

+0

なぜあなたは '$ _db'を好奇心から静的にしたいのですか? – Blake

+0

現在、私のデータベースにアクセスするには、アクセスする必要のあるすべてのメソッドで、次の行を繰り返すか、引数に渡す必要があります: '$ db = Database :: getInstance() - > getConnection();'私は全面的に繰り返すのではなく、私が使用できるクラス全体のアクセス可能な変数を持つ方が良いと感じています。 –

答えて

0

コンストラクトは、クラスの新しいインスタンスが作成されたときにのみ呼び出されます。 addUser()は静的メソッドなので、新しいインスタンスはで、は作成されません。コンストラクタは呼び出されず、静的な$_db変数は決して初期化されません。

私は、dbへの接続を返す静的メソッドを作成して、コード全体でどこでも使用できます。たとえば:あなたは、静的プロパティを使用し続けたい場合

class User { 

private static $_db; 

public function __construct() { 
    // construct 
} 

public static function getDB() { 
    return Database::getInstance()->getConnection(); 
} 

public static function addUser ($name, $username, $password) { 
    // Define Values 
    $name = ucwords(trim($name)); 
    $username = strtolower(trim($username)); 
    $password = password_hash($password, PASSWORD_BCRYPT); 

    // Define Query 
    $query = "INSERT INTO `users` (name, username, password) VALUES(:name, :username, :password)"; 

    // Prepare Query 
    $preparedQuery = self::getDB()->prepare($query); 

    // Execute Query 
    $preparedQuery->execute([ 
     ':name' => $name, 
     ':username' => $username, 
     ':password' => $password 
    ]); 
} 
} 

は、あなたがプロパティの静的セッターを作成することができます(addUserを呼び出す前に、少なくとも一度は、このメソッドを呼び出す必要があります):

public static function setDB() { 
    self::$_db = Database::getInstance()->getConnection(); 
} 
+0

それは動作するかなり良い方法のようです。静的ではないメソッドについては、私はそれらのコンストラクトを呼び出し、 'private $ _db'を設定します。 –

+0

あなたのニーズに合わせてコードを調整できます。静的でないメソッドは引き続き 'self :: getDB()'を使うことができるので、コードを複製する必要はありません。 – Andriko13

+0

本質的に静的メソッドは静的メソッドとプロパティを参照するだけで、静的メソッドは静的メソッドやプロパティにアクセスできますか? –