2017-10-25 25 views
-1

私はPHP OOPで新しく、これで誰かが私を助けてくれるのだろうかと思っていました。PHPのクラスプロパティへのアクセスOOP

データベースからデータを返す1つのメソッドを持つ基本クラスがあります。現在、関数内のすべてを表示するメソッドを呼び出しています。ここで

は私のクラスの定義である:ここで

class Products{ 
    //properties 
    public $familyName = ""; 
    public $familyProduct = ""; 

    //Methods 
    public function getFamily($catId){ 
    global $conn; 
    $sql = "SELECT * FROM product_family WHERE catID = '$catId'"; 
    $result = $conn->query($sql); 
    if($result->num_rows > 0){ 

     while($row = $result->fetch_assoc()){ 
      echo "<li>".$row['familyName']."</li>"; 
      echo "<li>".$row['familyProduct']."</li>"; 
     } 
     } 
    } 
} 

は、私はメソッドを呼び出す方法です:

$Products = new Products; 
$Products->getFamily(4); 

これは(どのように私はデータベースから来た各データを割り当てることができ、しかし、作品ex familyName、familyProduct)をクラス実装内の変数に格納し、必要に応じて個別にアクセスします。

$Products = new Products; 
$Products->familyName; 
$Products->familyProduct; 

私は空のプロパティを持っていますが、ループから来ている値をどのように割り当てることができるのかよく分かりません。

ありがとう、

+0

あなた 'getFamily'関数内でクラスのプロパティにアクセスするためには、(_this_オブジェクト、のように)、' $ this'を使用する必要があります: 'ます$ this-> familyName'はそれの値を返します。 、 '$ this-> familyName = 'test''はその値を設定します。 – WOUNDEDStevenJones

+0

$ this-> familyName = $ row ['familyName']? – Plotisateur

+0

さらに、 '$ products = new Products();'のようなオブジェクトを作成するときに自動的に実行される '__construct()'関数(Classコンストラクタと呼ばれる)を追加することもできます。したがって、情報を取得するDBクエリを持つコンストラクタがある場合、クラス内で '$ this->'を使用して値を設定することができます。次に '$ products-> familyName'を使用できます(または、 getterを使用して値を取得するために '$ products-> getFamilyName();'を使用してください – WOUNDEDStevenJones

答えて

1

あなたのコードで変更する予定のものがあります。

プロパティを公開しないでください。GettersとSettersを使用します。
これは、オブジェクトが間違った方法で使用されるのを防ぎます。今度はを外部から変更することはできません:$products->familyName = "some value"これは、オブジェクトのデータが壊れるためです。

global $conn;、あなたのケース$products = new Products($conn);


をオブジェクトの構造体を使用OOPには、外出先ではない今、あなたは猫のID $products->setCatId(4);を設定し、その結果を読むことができます
$familyName = $products->getFamilyName();または$familyProduct = $products->getFamilyProduct();

の場合catIdが常にこの行を削除できる行を1つ返す場合は、配列を取得する結果が複数あります。 OOPについてもっと知っていれば、ホールSQLのものは別のObjectで行うことができますが、これはトピック外です。

class Products 
{ 
    // Properties 
    protected $conn; 
    protected $catId; 
    protected $familyName; 
    protected $familyProduct; 

    public function __construct($conn) 
    { 
     $this->conn = $conn; 
    } 

    // set Cat ID and get date 
    public function setCatId($catId) 
    { 
     $this->catId = (int) $catId; 
     $this->getDate(); 
    } 

    public function getCatId() 
    { 
     return $this->catId; 
    } 

    // get Family Name 
    public function getFamilyName() 
    { 
     return $this->familyName; 
    } 

    // get Family Product 
    public function getFamilyProduct() 
    { 
     return $this->familyProduct; 
    } 

    // get date 
    protected function getDate() 
    { 
     $sql = "SELECT * FROM product_family WHERE catID = '$this->catId'"; 
     $result = $this->conn->query($sql); 

     // Default if no result 
     $this->familyName = null; 
     $this->familyProduct = null; 

     // if one Result 
     if ($result->num_rows == 1) 
     { 
      $row     = $result->fetch_assoc(); 
      $this->familyName = $row['familyName']; 
      $this->familyProduct = $row['familyProduct']; 
     } 

     if ($result->num_rows > 1) 
     { 

      $this->familyName = []; 
      $this->familyProduct = []; 

      while ($row = $result->fetch_assoc()) 
      { 
       $this->familyName[] = $row['familyName']; 
       $this->familyProduct[] = $row['familyProduct']; 
      } 
     } 
    } 
} 
+0

説明に時間を費やしていただき、ありがとうございます。私は何を得ているかを確認するためにテストを行い、答えを正しいものとしてマークします。 –

+0

FYI:whileループには1行ありました – Webdesigner

関連する問題