2010-06-13 10 views
47

저는 클래스와 객체 클래스 구조로 작업하고 있지만 복잡한 수준에서는 작동하지 않습니다. 클래스와 함수 만 한 곳에서 인스턴스화합니다.PHP 생성자의 목적

__construct__destruct은 매우 간단하게 말해주세요. 생성자 및 소멸자의 목적은 무엇입니까?

나는 학교 수준의 이론적 인 설명을 알고 있지만, 현실 세계에서 우리가 사용해야하는 상황을 기대하고 있습니다.

예를 제공하십시오.

감사

+0

eac 예제가 정말 좋습니다. 이제 사람들이 생성자와 생성자를 왜 보는지 이해하지만, 생성자를 사용하지 않으면 아무 것도 느껴지지 않습니다 ... bcoz 프로그램에서 우리는 많은 함수, 그리고 so..for 함수와 variabl, 어떻게 construc을 사용할 수 있습니까 거기에 어떤 동적 할당, 우리는 생성자 안에 모든 함수 이름을 호출해야합니다, – Bharanikumar

+1

수락 할 수없는 이유는 무엇입니까 ... 대답 .... 거기에 정말 답변 질문 대답 –

답변

7

클래스의 생성자는이 클래스에서 개체를 인스턴스화 할 때 어떤 일이 일어나는가를 정의한다. 클래스의 소멸자는 객체 인스턴스를 파기 할 때 발생하는 것을 정의합니다.

PHP Manual on Constructors and Destructors 참조 :

PHP 5는 개발자가 클래스의 생성자 메소드를 선언 할 수 있습니다. 생성자 메서드를 가진 클래스는 새로 생성 된 각 객체에서이 메서드를 호출하므로 객체를 사용하기 전에 객체가 필요로하는 모든 초기화에 적합합니다.

PHP 5는 C++와 같은 다른 객체 지향 언어와 유사한 소멸자 개념을 소개한다. 소멸자 메서드는 특정 객체에 대한 모든 참조가 제거되거나 객체가 명시 적으로 삭제되거나 종료 순서의 순서에 관계없이 호출됩니다.

실제로는 생성자를 사용하여 개체를 최소 유효 상태로 설정합니다. 즉, 생성자에 전달 된 인수를 객체 속성에 할당합니다. 개체가 속성으로 직접 할당 할 수없는 일종의 데이터 형식을 사용하는 경우 여기에 개체를 만듭니다.

class Example 
{ 
    private $database; 
    private $storage; 

    public function __construct($database) 
    { 
     $this->database = $database; 
     $this->storage = new SplObjectStorage; 
    } 
} 

하는 것으로, 검증 개체를 유지하기 위해 a constructor should not do any real work :

생성자의 작품과 같은 : 협력자를 초기화/생성하는 다른 서비스와 통신하고, 자신의 상태를 설정하는 논리 테스트에 필요한 솔기를 제거하여 하위 클래스/모의 객체가 원치 않는 동작을 상속하도록합니다. 생성자에서 너무 많은 작업을하면 인스턴스화 나 테스트에서 공동 작업자가 변경되는 것을 방지 할 수 있습니다.

위의에서 $database은 공동 작업자입니다. 그것은 자신의 라이프 사이클과 목적을 가지고 있으며 공유 인스턴스가 될 수 있습니다. 생성자 내부에서 생성하지 않을 것입니다. 한편, SplObjectStorageExample의 필수 부분입니다. 그것은 매우 동일한 라이프 사이클을 가지며 다른 객체와 공유되지 않습니다. 따라서, 그것은 new ctor에 괜찮습니다.

마찬가지로 소멸자를 사용하여 개체 뒤에 정리합니다. 대부분의 경우 PHP가 자동으로 처리하므로 불필요합니다. 이것이 야생에서 dtors보다 훨씬 많은 ctors를 보게되는 이유입니다.

+0

확인 죄송합니다, 예를 들어, 가정 캐시 기본 목적은 성능 향상, 심지어이 캐시 개념을 모니터링 할 수 있습니다, 또한 우리가 복사하는 한 파일에서 그 시간에 쿼리를 exacuting 레코드 및 다음에 사용자가 레코드를 누르려고하면 시스템은 라이브 DB가 아닌 파일 만 보게됩니다. 거기에 당신과 같은 어떤 것이 든 예를 들어 줄 수 있습니다. – Bharanikumar

+0

@Bharanikumar 그것은 당신이 위에 묻고있는 것과 완전히 다른 질문입니다. 캐시가 필요한 경우 APC 또는 memcache를 살펴보고 Zend_Cache와 같은 몇 가지 코드 예제를 살펴보십시오. – Gordon

+0

실제로 나는 캐시를 안다. .. 아무도 쉽게 이해할 수있다. 캐시와 같은 예제를 말할 수는 있지만, 지금은 많은 예제가있다. – Bharanikumar

48

생성자는 개체가 초기화 된 후 (메모리가 할당되고 인스턴스 속성이 복사되는 등) 실행되는 함수입니다. 그 목적은 객체를 유효한 상태로 두는 것입니다.

개체는 사용 가능한 상태에 있어야하는 경우가 종종 있습니다. 생성자의 목적은이 데이터를 인스턴스화시 오브젝트에 강제로 제공하고 이러한 데이터없이 인스턴스를 허용하지 않는 것입니다.

문자열을 캡슐화하고이 문자열의 길이를 반환하는 메서드가있는 간단한 클래스를 생각해보십시오. 한 가지 가능한 구현은 다음과 같습니다 유효한 상태에있을하기 위해

class StringWrapper { 
    private $str; 

    public function setInnerString($str) { 
     $this->str = (string) $str; 
    } 

    public function getLength() { 
     if ($this->str === null) 
      throw new RuntimeException("Invalid state."); 
     return strlen($this->str); 
    } 
} 

,이 기능은 getLength 전에 호출 할 setInnerString이 필요합니다. 생성자를 사용하면 getLength를 호출 할 때 좋은 상태로 모든 인스턴스를 강제 할 수

class StringWrapper { 
    private $str; 

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

    public function getLength() { 
     return strlen($this->str); 
    } 
} 

또한 문자열 인스턴스 후 변경할 수 있도록 setInnerString을 유지할 수 있습니다.

소멸자는 개체가 메모리에서 해제 될 때 호출됩니다. 일반적으로 클린업 코드를 포함합니다 (예 : 객체가 보유하고있는 파일 설명자를 닫음). PHP는 스크립트 실행이 끝날 때 스크립트가 보유한 모든 리소스를 정리하기 때문에 PHP에서는 거의 사용되지 않습니다.

+1

"유효한 상태에 객체 넣기"라는 또 다른 방법이있다. "개체 불변식이 맞는지 확인하십시오." 클래스의 불변량은 사실에 대해 항상 사실이어야합니다 : 내부 str 값은 항상 초기화되어야합니다. – Oddthinking

+0

좋은 예 ... –

41

예에 의해 알아보기 :

class Person { 
    public $name; 
    public $surname; 
    public function __construct($name,$surname){ 
    $this->name=$name; 
    $this->surname=$surname; 
    } 
} 

왜이 도움이된다? 대신 때문에 :

$person = new Person(); 
$person->name='Christian'; 
$person->surname='Sciberras'; 

당신은 사용할 수 있습니다

$person = new Person('Christian','Sciberras'); 

적은 코드이며, 청소기 보인다!

참고 : 아래의 응답이 올바르게 나타나므로 생성자/소멸자는 변수의 초기화/초기화 (특히 값이 가변적 인 경우), 메모리 할당/할당, 불변 식 능가) 및 더 깨끗한 코드. "깨끗한 코드"는 "설탕"뿐만 아니라 가독성, 유지 보수성 등을 향상시킵니다.

+0

공공 재산의 의문스런 사용과 별개로, 나는이 대답이 그 요점을 놓치고 있다고 생각합니다. 생성자는 암시적인 것처럼 단순한 통사론의 설탕이 아니라 불변성을 강요하는 방법입니다. – Artefacto

+5

더 깨끗하게 보일뿐만 아니라. 오류를 방지합니다 : 성을 설정하는 것을 잊으면 어떻게됩니까? 생성자는 당신이 그것을하도록 강요합니다. – johannes

+1

OP는 실생활에 대한 예를 묻습니다. 공공 재산의 사용은이 예가 두 경우 모두에 적용 가능하도록하는 것입니다. 내 대답은 어떤 점도 놓치지 않습니다. 생성자는 기본 변수를 설정하기 위해 (언급 한 내용을 포함하여) 무엇이든 사용할 수 있습니다. 빠른 예 : class A {보호 된 $ 경로; 공공 기능 __construct() {$ this-> path = getcwd(). '경로'; }} – Christian

7

생성자는 클래스 인스턴스를 인스턴스화 할 때 실행됩니다. 당신이 클래스 Person 그래서 만약 :

class Person { 

    public $name = 'Bob'; // this is initialization 
    public $age; 

    public function __construct($name = '') { 
     if (!empty($name)) { 
      $this->name = $name; 
     } 
    } 

    public function introduce() { 
     echo "I'm {$this->name} and I'm {$this->age} years old\n"; 
    } 

    public function __destruct() { 
     echo "Bye for now\n"; 
    } 
} 

을 보여주기 위해 :

$person = new Person('Fred'); 
$person->age = 20; 
$person->introduce(); 

// if there are no other references to $person and 
// unset($person) is called, the script ends 
// or exit() is called __destruct() runs 
unset($person); 

// I'm Fred and I'm 20 years old 
// Bye for now 

희망 설명하는 데 도움이 :

$person = new Person; 
$person->age = 20; 
$person->introduce(); 

// I'm Bob and I'm 20 years old 
// Bye for now 

우리는 생성자 인수를 통해 초기화 설정 기본값을 대체 할 수 있습니다 생성자와 소멸자가 호출되는 곳은 무엇인가?

  1. __construct()은 리소스가 있거나 더 복잡한 데이터 구조를 가진 기본 클래스 멤버가 될 수 있습니다.
  2. __destruct()은 파일 및 데이터베이스 핸들과 같은 리소스를 확보 할 수 있습니다.
  3. 생성자는 종종 class composition 또는 constructor injection of required dependencies에 사용됩니다. 나는 그것이 내가 생성자 전에 new 키워드에 대해 생각하면 이해하기 쉬운이었다 발견했습니다
0

: 그것은 단순히 데이터 형식의 새로운 객체가 내가 전화하는 생성자에 따라, 그에게 줄 것입니다 내 변수를 알려줍니다 그리고 제가 그것에 전달한 것, 도착시 객체의 상태를 정의 할 수 있습니다.

새로운 개체가 없으면 우리는 null의 땅에 살고 있으며 충돌합니다!

Destructor는 소멸자 메서드가 가리키는 모든 메모리를 삭제하지 않으면 프로그램이 종료되어 다음에 재부팅 할 때까지 클라이언트 OS에서 누출과 지연을 일으키는 데 계속 사용됩니다.

여기에는 충분한 정보가 충분하지만 다른 각도는 항상 내가 알아 차린 것에서 도움이됩니다.

+0

누출 부분에 대해서는 정확하지 않습니다. 프로그램을 종료하면 누수가 제거됩니다 (메모리가 다른 프로그램에있는 경우 제외). 프로그램을 사용하는 동안 메모리 누수가 심각하지 않으며 종료 할 때가 아닙니다. 예를 들어, 1 시간 동안 700Mb가 유출 된 프로그램을 한 번 사용했습니다. 그러나 닫힐 때 모두는 정상에 돌려 보냈다. – Christian