2010-11-28 13 views
1

ウェブサイトにクリアランスセクションを追加していますが、私はPDOの厄介な小さな問題に取り掛かります。私はClearanceItemクラスを作成して、個々のアイテムに関する情報を保持しています。アイテムのすべてのプロパティが保護されており、それらのアクセサとミューテータが作成されています。私はこのように2つの理由でクラスを作成しました:PDOでオブジェクトの新しいインスタンスを取得する際の問題

  1. プロパティが設定されていることを確認できます。これは、クライアントが管理しているExcelファイルからスケジュールに基づいてデータベースが設定されるため、重要です。ミューテータを使用すると、Excelファイルの情報が特定の範囲内にあることを確認できます。
  2. サイトが英語とフランス語の両方にあるため、アクセサはビューの言語に応じてデータ(価格など)を正しくフォーマットできます。

私は、各行に対して自動的にClearanceItemクラスの新しいインスタンスを取得し、PDO結果セットをループすることができます。これは、フェッチモードを設定するか、PDOStatement :: fetchObject()を使用して簡単に行えます。プロパティが保護されているという事実にもかかわらず、私は問題を抱えています。 PDOがクラスの新しいインスタンスを作成するときには、Reflection Injectionと呼ばれるものを使用してプロパティを設定するように見えます。これは、保護されたプロパティが、私が作成したミューテータをバイパスして、PDOによって直接設定されることを意味します。この性質のために、数値でなければならず(そして、ミューテータによってそのように設定される)、文字列として設定されます。最悪の場合は、MySQL GROUP_CONCATを使用して、複数のストアとインベントリの情報を単一の文字列として返すことです。この文字列は、ミューテータを配列に分割する必要があります。 PDOはこのプロパティを直接設定するため、文字列として終了します。

結果セットの行から返された配列からClearanceItemの新しいインスタンスを作成するファクトリメソッドを使用することで、この問題を簡単に解決できます。これは不要な余分なステップのように思えます。 PDOがレコードセット内の各行に対してクラスのインスタンスを返すことが可能かどうか知っていますか?プロパティを表示するには、ミューテータを使用してプロパティを設定します。

答えて

1

私が確認したところでは、プロパティセットごとに__set()関数が呼び出されます。

 
class test { 
    function __construct() { 
    print "Constructor\n"; 
    var_dump(func_get_args()); 
    } 
    function __get($x) { 
    print "In get\n"; 
    var_dump($x); 
    } 
    function __set($x, $y) { 
    print "In set\n"; 
    var_dump($x); 
    } 
} 

$m = getMasterPDODB(); 
$stm = $m->prepare("SELECT * FROM users"); 
if($stm && $stm->execute()) { 
    while($cls = $stm->fetchObject("test")) { 
    var_dump($cls); 
    } 
} 

は私に

 
Constructor 

array 
    empty 

In set 

string 'id' (length=2) 

In set 

string 'active' (length=6) 

In set 

string 'email' (length=5) 

In set 

string 'passphrase' (length=10) 

In set 

string 'details' (length=7) 

object(test)[5] 

Constructor 

array 
    empty 

In set 

string 'id' (length=2) 

In set 

string 'active' (length=6) 

In set 

string 'email' (length=5) 

In set 

string 'passphrase' (length=10) 

In set 

string 'details' (length=7) 

object(test)[6] 

Constructor 

array 
    empty 

In set 

string 'id' (length=2) 

In set 

string 'active' (length=6) 

In set 

string 'email' (length=5) 

In set 

string 'passphrase' (length=10) 

In set 

string 'details' (length=7) 

object(test)[5] 

Constructor 

array 
    empty 

In set 

string 'id' (length=2) 

In set 

string 'active' (length=6) 

In set 

string 'email' (length=5) 

In set 

string 'passphrase' (length=10) 

In set 

string 'details' (length=7) 

object(test)[6] 

Constructor 

array 
    empty 

In set 

string 'id' (length=2) 

In set 

string 'active' (length=6) 

In set 

string 'email' (length=5) 

In set 

string 'passphrase' (length=10) 

In set 

string 'details' (length=7) 

object(test)[5] 

を与え、私の詳細はJSONオブジェクトであるため、私は必要なフィールドに、そこからそれを解析できます。そこから作成したミューテータを呼び出すことができます。これは狂った忍者の魔法を行なわずに最善の方法と思われます。

+0

ありがとう、ジェレミー、それは非常に奇妙です。違いは、第2引数をコンストラクタに渡す引数の配列であるPDOStatement :: fetchObject()に渡していた点です。私はこの配列なしで自分のコードを試したときにも、私のために最初に働いた。私はその後、配列を再び追加しようとしましたが、以前と同じ問題がありました。本当に奇妙なことは、私は再び配列を削除したが、それでも同じ問題があったということです。私はPHPを再起動し、APCを無効にしましたが、運はありません。なぜこのようなことが起こるのか分かりません。何か案は? – Jeremy

関連する問題