2011-08-13 2 views
4

이것은 이상하게 보일 것입니다. 나는 MySQL을위한 데이터베이스 클래스와 독립 클래스를 가지고있다. 예 :PHP는 다른 클래스 런타임에서 확장됩니다 (변수로 확장?)

class users extends MySQL 

이 클래스는 사용자를위한 일반적인 클래스이므로 더 많이 사용할 수 있습니다. 그러나 때때로에 "MySQL_DEBUGGED"클래스가 존재하고, 만약 그렇다면, 나는 그것에서 확장 할 그렇지 않으면

class users extends MySQL_DEBUGGED 

내가있는 경우 MySQL_DEBUGGED을 상속하려면, MySQL의 클래스를. 변수에 넣으면 오류가 발생합니다. 그것을하는 방법?

+0

두 가지 다른 클래스 (MYSQL 및 MYSQL_DEBUGGED)가있는 이유는 무엇입니까? 그것은 나에게 문제는 당신이 더 자세한 (즉 : 디버그) 또는하지 않도록 구성 할 수있는 하나 대신 두 클래스가 있다는 것입니다 – laurac

+0

당신이 뭘하는지 모르지만 당신은 두 클래스 디버깅 때문에 logger (예 : log4php)를 사용해야하며 필요에 맞게 구성해야합니다. – laurac

답변

1

당신이해야 할 일은 class_exists() 기능을 사용하기 만하면됩니다.

if (class_exists('MySQL_DEBUGGED')) { 
    class users extends MySQL_DEBUGGED { 
     .... 
    } 
} else { 
    class users extends MySQL { 
     .... 
    } 
} 

나는 그것을 권장하지 않습니다. 조건부로 선언하는 클래스는 악몽처럼 보입니다.

+0

그게 전부입니다. 그런 다음 모든 메소드를 복사/붙여 넣기해야합니다. 피하고자하는 것을 – deeped

4

PHP 스크립트에 이름이없는 클래스에서 상속받을 수 있다고 생각하지 않습니다.


가능한 해결책은 다음과 같습니다

  • 두 개의 클래스를 정의하기 위해, 모두는
  • users 클래스는 항상 그 중 하나 의미합니다 (MySQL 클래스 를 확장하는 두 개의 별도의 파일에, MySQL라고 상황에 따라 두)
  • 포함 :
    • 을 은 "생산"MySQL 클래스를 포함 파일,
    • 또는 "개발"MySQL 클래스

이 방법이 들어있는 파일, 당신의 클래스는 항상 MySQL 클래스를 확장 -하지만 당신은 다음을 포함합니다 오른쪽 하나.


기본적으로 메인 파일에서, 당신은 할 것 :

if (DEBUG) { 
    require __DIR__ . '/MySQL-debug.php'; 
} 
else { 
    require __DIR__ . '/MySQL-production.php'; 
} 

class users extends MySQL { 
    // ... 
} 

그리고 모두 MySQL-debug.phpMySQL-production.phpMySQL라는 클래스가 포함됩니다 - 두 파일에서 같은 물건을 포함하지 않을의 코스.

+0

+1합니다. 이것은 멀리입니다. 더 좋은 방법. – Brad

+0

이것은 더 좋아 보이지만 MySQL-debug는 MySQL-production을 상속받습니다. 그래서 클래스 이름은 같을 수 없습니다 – deeped

+1

@deeped humph, 나쁘다; MySQL-debug와 MySQL-production을 함께 사용하면 일반적인 공통 코드를 모두 포함하는 일반적인 MySQL 공통 클래스를 확장 할 수 있습니까? –

1

가장 쉬운 해결책은 빈 "브리지"클래스가 있고 그 클래스에서 항상 상속받는 것입니다.

그런 다음 두 번 선언해야 할 유일한 클래스는 빈 클래스입니다. 페이지에

if (class_exists('MySQL_DEBUGGED')) { 
    class MySQLBridge extends MySQL { } 
} else { 
    class MySQLBridge extends MySQL_DEBUGGED { } 
} 

class User extends MySQLBridge { 
    // ... your code ... 
} 

그리고 마지막으로 :

require_once('User.php'); 
$user = new User(); 

다른 제안 된 솔루션을 내가하지 않는 것이 좋습니다 상속 된 클래스의 두 복사본을 가지고 당신을 필요로합니다.