2016-07-13 1 views
0

내 데이터베이스 클래스가 상속되는 상위 클래스 (후기 정적 바인딩 사용)를 작성했습니다. 각 테이블 열을 자식 클래스의 public 속성으로 할당하는 생성자를 작성하려고합니다. 지금까지 잘 작동하는 하위 클래스의 생성자를 작성할 수 있지만 모든 하위 클래스 속성이 자동으로 정의되도록 부모 클래스에 넣고 싶습니다.부모 클래스를 통해 호출 된 클래스 속성 정의

class Sale extends DatabaseObject { 

    protected static $table_name="invoices"; 
    protected static $db_fields = array(); 

    function __construct() { 
     global $database; 
     $query_cols = " SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_NAME LIKE '" . self::$table_name . "' AND TABLE_SCHEMA LIKE '" . DB_NAME . "' ORDER BY ORDINAL_POSITION ASC"; 
     $cols = $database->query($query_cols); 
     while($col = $database->fetch_array($cols)) { 
      if(!property_exists($this,$col['COLUMN_NAME'])) { 
       $this->$col['COLUMN_NAME']=NULL; 
       array_push(self::$db_fields,$col['COLUMN_NAME']); 
      } 
     } 
    } 
} 

내가 호출 된 클래스의 속성을 정의 할 수 있어야 부모에서이 생성자를 사용하려면 : 여기 내 아이 클래스입니다.

function __construct() { 
    $class_name = get_called_class(); 
    $query_cols = " SELECT COLUMN_NAME FROM information_schema WHERE TABLE_NAME LIKE '" . static::$table_name . "' AND TABLE_SCHEMA LIKE '" . DB_NAME . "'"; 
    $query_cols .= " ORDER BY ORDINAL_POSITION ASC"; 
    $cols = $database->query($query_cols); 
    while($col = $database->fetch_array($cols)) { 
     if(!property_exists($class_name,$col['COLUMN_NAME'])) { 
      // the code to define called class public property?! 
     } 
    } 
} 

미리 감사드립니다.

답변

0

일반적으로 클래스의 정적 멤버에 액세스하는 경우 self :: $ foo 대신 static :: $ foo를 사용할 수 있지만 각 자식 클래스에 대해 빈 초기 정적 변수를 다시 선언해야합니다. 부모의 정적 멤버를 사용합니다.

Model 시스템에 사용하는 다른 방법은 클래스 이름을 배열 구조의 일부로 사용하는 것입니다. 키가

그래서 그 대신

array_push(self::$db_fields,$col['COLUMN_NAME']); 

의 각 요소와,

array_push(self::$db_fields[$class_name],$col['COLUMN_NAME']); 

자식 클래스 필드의 배열을 사용하면 기본적으로 부모 클래스 수준에서 단일 배열이이 방법을 할 것, 그들의 학급 이름으로.

+0

클래스의 공용 멤버는 어떨까요?! 정적 멤버의 경우 '정적'을 사용하지만 공개 멤버는 무엇입니까? 어떻게 적용 할 수 있습니까? – MehdiK

+0

정적 및 공용은 상호 배타적이지 않으며 구성원은 공용, 보호 또는 개인, 정적 또는 비 정적 중 하나 일 수 있습니다. 비 정적 멤버의 경우,'$ this' (또는 다른 변수 참조)를 사용하여 액세스 할 수 있으므로'self','static' 등은 필요 없습니다. – Stephen

+0

감사합니다. '$ this' 문제를 해결했습니다! – MehdiK

관련 문제