developer tip

PHP의 클래스는 무엇입니까?

copycodes 2020. 11. 6. 18:54
반응형

PHP의 클래스는 무엇입니까?


책에서 PHP 클래스를 이해하는 데 심각한 문제가 있습니다. 그들은 매우 어려워 보입니다. 그들의 목적은 무엇이며 어떻게 작동합니까?


간단히 말해 , 클래스는 객체의 청사진입니다. 그리고 객체는 응용 프로그램에서 개념적으로 관련된 상태 및 책임을 캡슐화하고 일반적으로 이들과 상호 작용할 프로그래밍 인터페이스를 제공합니다. 이는 코드 재사용을 촉진하고 유지 보수성을 향상시킵니다.


자물쇠를 상상 해보세요 :

namespace MyExample;

class Lock
{
    private $isLocked = false;

    public function unlock()
    {
        $this->isLocked = false;
        echo 'You unlocked the Lock';
    }
    public function lock()
    {
        $this->isLocked = true;
        echo 'You locked the Lock';
    }
    public function isLocked()
    {
        return $this->isLocked;
    }
}

지금 namespace, privatepublic선언을 무시하십시오 .

Lock 클래스는 애플리케이션의 모든 잠금에 대한 청사진입니다. 잠금은 속성으로 표시되는 잠기 거나 잠금 해제 될 수 있습니다 . 이 두 가지 상태 만 가질 수 있으므로 적용되는 상태를 나타 내기 위해 부울 ( 또는 )을 사용합니다 . 그에 따라 상태를 변경하는 메서드 및을 통해 Lock과 상호 작용할 수 있습니다 . 메서드는 나에게 Lock의 현재 상태를 제공합니다. 이제이 블루 프린트에서 객체 (종종 인스턴스 라고도 함)를 생성하면 고유 상태를 캡슐화합니다. $isLockedtruefalse lockunlockisLocked

$aLock = new Lock; // Create object from the class blueprint
$aLock->unlock();  // You unlocked the Lock
$aLock->lock();    // You locked the Lock

또 다른 잠금을 만들고 자체 상태를 캡슐화 해 보겠습니다.

$anotherLock = new Lock;
$anotherLock->unlock(); // You unlocked the Lock

하지만 각 객체 / 인스턴스가 자체 상태를 캡슐화하기 때문에 첫 번째 잠금은 잠긴 상태로 유지됩니다.

var_dump( $aLock->isLocked() );       // gives Boolean true
var_dump( $anotherLock->isLocked() ); // gives Boolean false

이제 Lock을 잠금 또는 잠금 해제 상태로 유지하는 전체 책임은 Lock 클래스 내에 포함됩니다. 당신은 당신이 잠금은 모든 클래스 대신 잠금의 청사진에서 변경할 수 있습니다 작동 방식을 변경하려는 당신이 잠금 뭔가하고 있다면 할 때마다 다시 작성하지 않아도 가진 문을 잠금을, 예를 :

class Door
{
    private $lock;
    private $connectsTo;

    public function __construct(Lock $lock)
    {
        $this->lock = $lock;
        $this->connectsTo = 'bedroom';
    }
    public function open()
    {
        if($this->lock->isLocked()) {
            echo 'Cannot open Door. It is locked.';
        } else {
            echo 'You opened the Door connecting to: ', $this->connectsTo;
        }
    }
}

이제 Door 오브젝트를 만들 때 Lock 오브젝트를 할당 할 수 있습니다. Lock 객체는 무언가가 잠겼는지 잠금 해제되었는지에 대한 모든 책임을 처리하므로 Door는 이에 대해 신경 쓸 필요가 없습니다. 사실 Lock을 사용할 수있는 모든 물체는 신경 쓸 필요가 없습니다.

class Chest
{
    private $lock;
    private $loot;

    public function __construct(Lock $lock)
    {
        $this->lock = $lock;
        $this->loot = 'Tons of Pieces of Eight';
    }
    public function getLoot()
    {
        if($this->lock->isLocked()) {
            echo 'Cannot get Loot. The chest is locked.';
        } else {
            echo 'You looted the chest and got:', $this->loot;
        }
    }
}

보시다시피 상자의 책임은 문과 다릅니다. 상자에는 전리품이 들어 있고 문은 방을 구분합니다. 잠금 또는 잠금 해제 상태를 두 클래스 모두에 코딩 할 수 있지만 별도의 잠금 클래스를 사용하면 잠금을 재사용 할 필요가 없으며 재사용 할 수 있습니다.

$doorLock = new Lock;
$myDoor = new Door($doorLock);

$chestLock = new Lock;
$myChest new Chest($chestLock);

이제 상자와 문에 고유 한 잠금 장치가 있습니다. 자물쇠가 양자 물리학에서와 같이 동시에 여러 위치에 존재할 수있는 마법의 자물쇠라면 가슴과 문에 같은 자물쇠를 할당 할 수 있습니다.

$quantumLock = new Lock;
$myDoor = new Door($quantumLock);
$myChest new Chest($quantumLock);

그리고 때 , 도어와 가슴 모두 잠금을 해제 할 수있다.unlock()$quantumLock

While I admit Quantum Locks are a bad example, it illustrates the concept of sharing of objects instead of rebuilding state and responsibility all over the place. A real world example could be a database object that you pass to classes using the database.

Note that the examples above do not show how to get to the Lock of a Chest or a Door to use the lock() and unlock() methods. I leave this as an exercise for your to work out (or someone else to add).

Also check When to use self over $this? for a more in-depth explanation of Classes and Objects and how to work with them

For some additional resources check


I know you asked for a resource, not an explanation, but here's something by what I understood basic implementation of classes:

Imagine class as a template of building. A basic sketch how a building should look like. When you are going to actually build it, you change some things so it looks like your client wants (properties in case of class). Now you have to design how things inside of the building are going to behave (methods). I'm going to show it on a simple example.

Building class:

/**
 * Constructs a building.
 */
class Building
{
    private $name;
    private $height;


    public function __construct( $name, $height )
    {
        $this->name = $name;
        $this->height = $height;
    }

    /**
     * Returns name of building.
     * 
     * @return string
     */
    public function getName( )
    {
        return $this->name;
    }


    public function elevatorUp( )
    {
        // Implementation
    }


    public function elevatorDown( )
    {
        // Implementation
    }


    public function lockDoor( )
    {
        // Implementation
    }
}

Calling the class:

// Empire State Building
$empireStateBuilding = new Building( "Empire State Building", 381 );

echo $empireStateBuilding->getName( );
$empireStateBuilding->lockDoor( );


// Burj Khalifa
$burjKhalifa = new Building( "Burj Khalifa", 828 );

echo $burjKhalifa->getName( );
$burjKhalifa->lockDoor( );

Just copy it, run it on your localhost and try to do some changes. In case of any questions, just ask me. If you don't find this useful, just use links of previous posters, those are pretty solid tutorials.


To offer a view from another angle if I may please (based on personal experience). You need to feel "the need of OOP" before you can actually understand what is it all about - IMHO, learning resources should come after this.

One would basically "need" to be stuck in structural difficulties when writing relatively large piece of software written in procedural style (as opposed to Object Oriented, sorry if anyone disagree with the term). By then, he/she could try restructuring the code into objects to better organize it and, naturally, learn more about OOP in detail. Again, this is my personal experience and it brought me into understanding faster than any book.

Just my two cents.

참고URL : https://stackoverflow.com/questions/2206387/what-is-a-class-in-php

반응형