programing tip

PHP 생성자의 목적

itbloger 2021. 1. 7. 07:41
반응형

PHP 생성자의 목적


저는 클래스와 객체 클래스 구조로 작업하고 있지만 복잡한 수준은 아닙니다. 클래스와 함수 만 한 다음 한 곳에서 인스턴스화합니다.

에 관해서는 __construct__destruct, 아주 간단하게 말해주십시오 : 생성자와 소멸자의 목적은 무엇인가 ?

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

예를 들어주세요.

문안 인사


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

종종 개체가 사용 가능한 상태가 되려면 일부 데이터가 필요합니다. 생성자의 목적은 인스턴스화 시간에이 데이터를 개체에 강제로 제공하고 이러한 데이터가없는 인스턴스를 허용하지 않는 것입니다.

문자열을 캡슐화하고이 문자열의 길이를 반환하는 메서드가있는 간단한 클래스를 고려하십시오. 한 가지 가능한 구현은 다음과 같습니다.

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);
    }
}

유효한 상태가 되려면이 함수 setInnerString를 전에 호출해야 getLength합니다. 생성자를 사용하면를 getLength호출 할 때 모든 인스턴스를 양호한 상태로 만들 수 있습니다 .

class StringWrapper {
    private $str;

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

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

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

소멸자는 객체가 메모리에서 해제 되려고 할 때 호출됩니다. 일반적으로 여기에는 정리 코드가 포함되어 있습니다 (예 : 개체가 보유하고있는 파일 설명자 닫기). PHP에서는 스크립트 실행이 종료 될 때 스크립트가 보유한 모든 리소스를 정리하기 때문에 PHP에서는 드뭅니다.


예를 들어 배우십시오 :

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');

코드가 적고 깔끔해 보입니다!

참고 : 아래의 답변이 올바르게 명시되어 있으므로 생성자 / 소멸자는 변수의 삭제 / 초기화 (특히 값이 변수 인 경우), 메모리 해제 / 할당, 불변성 (초과 될 수 있음) 및 더 깨끗한 코드. 또한 "깨끗한 코드"는 단순히 "설탕"이 아니라 가독성, 유지 보수성 등을 향상 시킨다는 점에 주목하고 싶습니다.


생성자는 클래스의 인스턴스를 인스턴스화 할 때 실행됩니다. 그래서 수업이 있다면 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;
$person->age = 20;
$person->introduce();

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

생성자 인수를 통해 초기화로 설정된 기본값을 재정의 할 수 있습니다.

$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

생성자와 소멸자가 어디에서 호출되는지 보여주는 데 도움이 되었으면 좋겠습니다.

  1. __construct() 리소스 또는 더 복잡한 데이터 구조를 가진 기본 클래스 멤버가 될 수 있습니다.
  2. __destruct() 파일 및 데이터베이스 핸들과 같은 리소스를 해제 할 수 있습니다.
  3. 생성자는 클래스 구성 또는 필수 종속성의 생성자 주입에 자주 사용됩니다 .

클래스의 생성자는이 클래스에서 객체를 인스턴스화 할 때 발생하는 일을 정의합니다. 클래스의 소멸자는 객체 인스턴스를 파괴 할 때 발생하는 일을 정의합니다.

See the PHP Manual on Constructors and Destructors:

PHP 5 allows developers to declare constructor methods for classes. Classes which have a constructor method call this method on each newly-created object, so it is suitable for any initialization that the object may need before it is used.

and

PHP 5 introduces a destructor concept similar to that of other object-oriented languages, such as C++. The destructor method will be called as soon as all references to a particular object are removed or when the object is explicitly destroyed or in any order in shutdown sequence.

In practise, you use the Constructor to put the object into a minimum valid state. That means you assign arguments passed to the constructor to the object properties. If your object uses some sort of data types that cannot be assigned directly as property, you create them here, e.g.

class Example
{
    private $database;
    private $storage;

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

Note that in order to keep your objects testable, a constructor should not do any real work:

Work in the constructor such as: creating/initializing collaborators, communicating with other services, and logic to set up its own state removes seams needed for testing, forcing subclasses/mocks to inherit unwanted behavior. Too much work in the constructor prevents instantiation or altering collaborators in the test.

In the above Example, the $database is a collaborator. It has a lifecycle and purpose of it's own and may be a shared instance. You would not create this inside the constructor. On the other hand, the SplObjectStorage is an integral part of Example. It has the very same lifecycle and is not shared with other objects. Thus, it is okay to new it in the ctor.

Likewise, you use the destructor to clean up after your object. In most cases, this is unneeded because it is handled automatically by PHP. This is why you will see much more ctors than dtors in the wild.


I've found it was easiest to grasp when I thought about the new keyword before the constructor: it simply tells my variable a new object of its data type would be give to him, based on which constructor I call and what I pass into it, I can define to state of the object on arrival.

Without the new object, we would be living in the land of null, and crashes!

The Destructor is most obvious from a C++ stand point, where if you dont have a destructor method delete all the memory pointed to, it will stay used after the program exits causing leaks and lag on the clients OS untill next reboot.

I'm sure there's more than enough good information here, but another angle is always helpful from what I've noticed!


constructor is function of class which is executed automatically when object of class is created we need not to call that constructor separately we can say constructor as magic method because in php magic method begin with double underscore characters

ReferenceURL : https://stackoverflow.com/questions/3032808/purpose-of-php-constructors

반응형