2012-10-31 2 views
1

저는 몇 가지 간단한 클래스로 PHP 프로젝트를 진행하고 있습니다. 클래스를 좀 더 복잡하게 만드는 작업을하고 있지만 사용자 관리, 구성 설정, 표시 등과 같은 추가 작업을 위해 클래스를 사용하기 시작했습니다. "구성하는 방법"을 파악하는 데 어려움을 겪고 있습니다. . 이 수업을 어떻게 확장해야합니까? PHP 프로젝트에서 클래스 구성/확장하기

내가 가지고있는 다음과 같은 클래스 :

//main application settings, constants, etc. 
Class Config { 
} 

//add/edit/delete/check permissions of users 
Class Users extends Config { 
} 

//displays the pages 
Class Display extends Config { 
} 

//main application 
Class Analysis extends Config { 
} 

//specific methods for this type of analysis 
Class Standard extends Analysis { 
} 

//specific methods for this type of analysis 
Class Consolidated extends Analysis { 
} 

의 I는 데 문제가 내가 다른 모든 클래스 (표시, 분석, 표준 및 통합에서 사용자 및 구성 클래스에 액세스 할 수 있도록하려는 것입니다). 어떻게하면 좋을까요? 나는 수업을 제대로 확장하고 있습니까? 나는 Display and Analysis가 사용자를 확장해야한다고 생각하지만 그것은 나에게 맞는 것 같지 않습니다. 제공 할 수있는 도움에 감사드립니다. 감사!

+0

사용중인 PHP 버전은 무엇입니까 ?? '5.4' 또는'<5.4' – Baba

+0

PHP 5.4 버전을 사용하고 있습니다. – Jeff

답변

1

내 프로젝트에서 사용자 및 구성 클래스는 singleton classes이며 간단한 메소드 호출로 다른 클래스로 인스턴스를 쉽게 가져올 수 있습니다.

Class User{ 
    private static $_instance; 

    private function __construct(){ 
    } 

    public function getInstance(){ 
     if(!self::$_instance){ 
      self::$_instance = new User(); 
     } 

     return self::$_instance; 
    } 
} 

그럼 어디든지 나는 자동 로딩을 사용 후 별도의 파일에 보관하고, 그 사용자 개체

$user = User::getInstance(); 
+0

마지막 부분에 대해서는 수업 중 하나에서 어떻게 그 부분을 참조 하시겠습니까? – Jeff

+0

정적 메서드를 사용하여 개체를 인스턴스화 할 때 다른 클래스를 비롯하여 동일한 방식으로 동일한 방법으로 새 ​​개체를 인스턴스화하는 대신 항상 동일한 개체를 가져옵니다. –

0

에 액세스해야합니다. OOP를 미친 듯이하는 경향을 피하십시오. 클래스는 단순히 확장 메소드가 아니라 속성으로 참조 될 수 있습니다.

1

당신은 엄지 손가락의 일반적으로

trait Config { 
} 

// Common to Display 
abstract class Display { 
    function __construct(Users $user); 
} 

// Common to analysis 
abstract class Analysis { 

    function __construct(Users $user); 
} 

// add/edit/delete/check permissions of users 
class Users { 
    use Config ; 
} 

// Mobile Display 
class Mobile extends Display { 
} 

// Web Display 
class Web extends Display { 
} 

// specific methods for this type of analysis 
class Standard extends Analysis { 
} 

// specific methods for this type of analysis 
class Consolidated extends Analysis { 
} 

// main application 
class Main { 
    use Config ; 
    public function setDisplay(Display $display); 
    public function setAnalysis(Analysis $analysis); 
} 

$user = new Users("Jeff"); 
$main = new Main(); 
$main->setDisplay(new Mobile($user)); 
$main->setAnalysis(new Standard($user)); 
+0

예를 들어 주셔서 감사합니다! 이제 Analysis 및 Display 클래스의 메서드에 어떻게 액세스합니까? $ main-> method를 사용합니까? – Jeff

+0

http://pastebin.com/SM53hWRZ 또는 이와 비슷한 http://pastebin.com/cunpS6is가 될 수 있습니다. – Baba

0

을 시도 할 수 있습니다, 당신은 클래스의 계층 구조를 구성 할 "is-a"원리를 사용할 수 있습니다. 같은 당신이 무엇을 설명 들어 보이는 :

  • StandardConsolidated이이 계층에 대한 좋은 후보처럼 보이는, 그래서 Analysis,합니다 ( 의미-A는에서).
  • UserDisplayConfig 값에 액세스해야하지만 개념적 방식과 관련이 없거나 공통적 인 동작을 공유하지 않는 것으로 보입니다. 따라서 컴포지션이 여기에 상속 된 것보다 적합합니다. 에 관한

는-A는 일반적으로 할 때 서브 클래스 상속이에 속하지 않는 행동이 맞지 않는 것을 인식 할 것이다 원칙. 예를 들어 Config 클래스에 saveValuesToDB() 클래스가있는 경우 이는 User이 (예 : 구성 값이 DB에 저장되는 방식)에 대해 신경 써서는 안되는 것입니다. 당신은 상속과 구성을 검색하여 주제에 관한 많은 정보를 찾을 수 있으며 패턴 커뮤니티에서 반복되는 주제입니다. OO 디자인과 패턴에 관한 좋은 책 목록은 here입니다.

HTH

관련 문제