PHP bir sınıf nedir?

3 Cevap php

Ben bir kitaptan PHP sınıfları anlamakta ciddi sorunlar yaşıyorum. Onlar çok zor görünüyor. Ne onların amacı ve nasıl çalışır?

3 Cevap

In a nutshell, bir sınıf bir nesne için bir plandır. Ve bir nesne kavramsal ilgili Devleti ve Uygulama şey Sorumluluğu kapsüller ve genellikle bu etkileşim hangi bir programlama arabirimi sunuyor. Bu kod yeniden teşvik ve dayanıklılığını artırır.


Bir Kilidi düşünün:

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

Şu anda namespace, private ve public beyanı görmezden.

Kilit sınıfı, uygulama tüm Kilitler için bir plandır. Bir Kilit locked ya da unlocked, property $isLocked ile temsil edilen ya olabilir. Sadece bu iki durumu olabilir beri, ben (true veya false) uygulandığı durum belirtmek için bir Boole kullanın. Ben bunun üzerinden Lock ile etkileşim var methods lock ve unlock, buna durumunu değiştirecek. isLocked yöntemi bana Lock mevcut durumunu verecektir. Bu planın bir nesne oluşturmak Şimdi zaman, bu eşsiz devlet, örneğin içine alır

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

Aynı zamanda kendi devletini sarması, Başka bir kilidi yaratalım

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

Her nesne o kendi durumunu saklar çünkü, ilk kilit kilitli kalır

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

Şimdi kilitli veya kilidi ya Kilidi tutmanın tüm reponsibility Kilit sınıf içinde encaspulated edilir. Bunu bir şey kilitlemek istediğiniz her zaman yeniden etmek zorunda değilsiniz ve bir Lock, örneğin, bunun yerine tüm sınıfları having bir Lock Lock planı bu değiştirebilirsiniz nasıl çalıştığını değiştirmek istiyorsanız Bir Kapı:

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

Bir Kapı nesne oluşturduğunuzda Şimdi buna bir Lock nesnesi atayabilirsiniz. Kilit nesne şey kilitli olup olmadığını tüm sorumluluğu kolları yana, Kapı bu umurumda zorunda değildir. Aslında bir Lock kullanabilirsiniz herhangi bir nesne, örneğin, bir Göğüs bakım olmazdı

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

Gördüğünüz gibi, Göğüs reponsibility bir kapı farklıdır. Bir kapı odaları ayıran ise bir göğüs, yağma içerir. Her iki sınıfa kilitli veya kilidi durumunu kod olabilir, ancak ayrı Kilit sınıf ile, gerekmez ve Kilit yeniden kullanabilirsiniz.

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

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

Göğüs ve Kapı artık benzersiz kilitleri var. Kilit Kuantum fiziği gibi, aynı anda birden fazla yerde bulunabilir büyülü bir kilit olsaydı, örneğin, göğüs ve kapı hem de aynı kilidi atayabilirsiniz

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

ve unlock() $quantumLock, Kapı ve Göğüs hem kilidi olacağını zaman.

Ben Kuantum Kilitler kötü bir örnektir itiraf ederken, bunun yerine her yerde devlet ve sorumluluk yeniden nesnelerin paylaşımı kavramını göstermektedir. Bir gerçek dünya örnek sınıfları using veritabanı geçmek bir veritabanı nesnesi olabilir.

Yukarıdaki örnekler lock() ve unlock() yöntemleri kullanmak için bir Göğüs ya da bir Kapı Kilidi nasıl görünmüyor unutmayın. Ben senin çalışmak için egzersiz (ya da eklemek başkası) olarak bırakın.

Ayrıca When to use self vs $this? Sınıflar ve Nesneler daha derinlemesine açıklama için ve nasıl onlarla çalışmak için kontrol

Bazı ek kaynaklar onay için

Sana bir kaynak değil, bir açıklama istedi biliyorum, ama burada sınıfların temel uygulanmasını anladım ne göre bir şey var:

Binanın bir şablon olarak sınıf düşünün. Nasıl bir bina temel bir kroki gibi görünmelidir. Aslında bunu yapacağız zaman müşteri (class durumunda özelliklerini) istiyor gibi görünüyor, bu yüzden bazı şeyleri değiştirmek. Şimdi binanın içinde işler davranmak için gidiyoruz nasıl tasarlamak zorunda (methods). Ben basit bir örnek üzerinde göstermek için gidiyorum.

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

Sadece kopyalayın localhost üzerinde çalıştırmak ve bazı değişiklikler yapmaya çalışın. Herhangi bir soru durumunda, sadece bana sor. Bu kullanışlı, sadece önceki posterleri bağlantıları kullanabilirsiniz bulamazsanız, bu oldukça sağlam öğreticiler.

Ben lütfen eğer (kişisel deneyime dayalı) bir başka açıdan bir görünüm sunmak. IMHO, kaynaklar bu sonra gelmelidir öğrenme - Sen aslında tüm hakkında ne olduğunu anlamak için önce "OOP ihtiyacı" hissetmek gerekir.

(Herkes dönem katılmıyorum eğer üzgünüm, Object Oriented aksine) prosedürel tarzında yazılmış yazılımlar nispeten büyük bir parça yazarken tek bir temelde yapısal zorluklar içinde sıkışmış olması "gerekir" olacaktır. O, o / o ayrıntılı OOP hakkında daha fazla bilgi edinmek, doğal, daha iyi organize etmek nesneleri içine kodunu yeniden deneyin ve olabilir. Yine, bu benim kişisel deneyim ve daha hızlı daha herhangi bir kitabı anlayış içine götürdü.

Sadece benim iki sent.