2017-10-25 1 views
-1

PHP OOP의 새로운 기능이며, 누군가 내가 이것을 도울 수 있는지 궁금해하고있었습니다.PHP OOP의 클래스 속성에 액세스하기

데이터베이스에서 데이터를 반환하는 한 가지 방법으로 기본 클래스가 있습니다. 현재 함수 안에 모든 것을 표시하는 메서드를 호출하고 있습니다.

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

, 당신은'(에서와 같이, _this_ 객체) $ this' 사용해야합니다 :'$ this->을 familyName'는 그것의 값을 반환합니다 ,'$ this-> familyName = 'test''가 그 값을 설정합니다. – WOUNDEDStevenJones

+0

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

+0

또한'$ products = new Products();'와 같은 객체를 생성 할 때 자동으로 실행되는'__construct()'함수 (클래스 생성자)를 추가 할 수 있습니다. 따라서 정보를 얻기 위해 DB 쿼리를 사용하는 생성자가 있다면 클래스 내에서 $ this->를 사용하여 값을 설정할 수 있습니다. 그러면 $ products-> familyName'을 사용할 수 있습니다 (또는 더 나은 방법으로 getter를 사용하고 값을 얻기 위해'$ products-> getFamilyName();'을 사용하십시오. – WOUNDEDStevenJones

답변

1

코드에서 변경된 사항이 있습니다.

속성을 공용으로 사용하면 Getters 및 Setters가 사용되지 않습니다.
이렇게하면 Object가 잘못된 방식으로 사용되는 것을 방지 할 수 있습니다. 이제 외부의 familyName을 변경할 수 없습니다. $products->familyName = "some value"은 개체의 데이터가 손상 될 수 있기 때문에 변경할 수 없습니다.

global $conn;

는 OOP의 더 이동이 $products = new Products($conn);

지금 당신이 고양이 ID $products->setCatId(4);을 설정할 수 있습니다 귀하의 경우, 개체의
를 구조를 사용하지 않고 결과를 읽을 수있다
$familyName = $products->getFamilyName(); 또는 $familyProduct = $products->getFamilyProduct();

하는 경우 catId가 항상 한 행을 반환하면이 부분을 삭제할 수있는 배열이 여러 개 있습니다. OOP에 대해 더 많이 알게되면 hole SQL stuff은 별도의 Object로 수행 될 수 있지만 이것이 Topic과 다릅니다.

당신의`getFamily` 함수 내 클래스의 속성에 액세스하기 위해
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 회 돌이가 많이 생겼습니다. – Webdesigner