Was ist eine Klasse in PHP?

68

Ich habe ernsthafte Probleme, PHP-Klassen aus einem Buch zu verstehen. Sie scheinen sehr schwierig zu sein. Was ist ihr Zweck und wie arbeiten sie?

Erdbeere
quelle

Antworten:

198

Kurz gesagt , eine Klasse ist eine Blaupause für ein Objekt. Ein Objekt kapselt den konzeptionell verwandten Status und die Verantwortung von etwas in Ihrer Anwendung und bietet normalerweise eine Programmierschnittstelle, mit der Sie mit diesen interagieren können. Dies fördert die Wiederverwendung von Code und verbessert die Wartbarkeit.


Stellen Sie sich ein Schloss vor:

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

Ignorieren die namespace, privateund publicErklärung jetzt.

Die Lock-Klasse ist eine Blaupause für alle Locks in Ihrer Anwendung. Eine Sperre kann entweder gesperrt oder entsperrt werden , dargestellt durch die Eigenschaft $isLocked . Da es nur diese beiden Zustände haben kann, verwende ich einen Booleschen Wert ( trueoder false), um anzugeben, welcher Zustand gilt. Ich kann mit der Sperre über ihre Methoden interagieren lockund dadurch unlockden Status entsprechend ändern. Die isLockedMethode gibt mir den aktuellen Status der Sperre. Wenn Sie nun ein Objekt (auch oft als Instanz bezeichnet ) aus dieser Blaupause erstellen , kapselt es einen eindeutigen Status, z

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

Erstellen wir eine weitere Sperre, die auch den eigenen Status kapselt

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

Da jedoch jedes Objekt / jede Instanz seinen eigenen Status kapselt, bleibt die erste Sperre gesperrt

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

Jetzt ist die gesamte Verantwortung, ein Schloss entweder gesperrt oder entsperrt zu halten, in der Lock-Klasse zusammengefasst. Sie müssen nicht jedes Mal , wenn Sie etwas wollen Schloss umgebaut und wenn Sie ändern möchten , wie eine Sperre funktioniert , wie Sie diese in den Bauplan der Sperre anstelle aller Klassen ändern kann mit einer Sperre, zB eine Tür:

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

Wenn Sie jetzt ein Türobjekt erstellen, können Sie ihm ein Sperrobjekt zuweisen. Da das Lock-Objekt die gesamte Verantwortung dafür übernimmt, ob etwas gesperrt oder entsperrt ist, muss sich die Tür nicht darum kümmern. Tatsächlich müssten sich Objekte, die ein Schloss verwenden können, nicht darum kümmern, zum Beispiel eine Truhe

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

Wie Sie sehen können, unterscheidet sich die Verantwortung der Truhe von der einer Tür. Eine Truhe enthält Beute, während eine Tür Räume trennt. Sie können den gesperrten oder entsperrten Status in beide Klassen codieren, aber mit einer separaten Lock-Klasse müssen und können Sie die Sperre nicht wiederverwenden.

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

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

Truhe und Tür haben jetzt ihre einzigartigen Schlösser. Wenn das Schloss ein magisches Schloss wäre, das gleichzeitig an mehreren Orten existieren kann, wie in der Quantenphysik, könnten Sie Brust und Tür dasselbe Schloss zuweisen, z

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

und wenn Sie unlock()das $quantumLock, würden sowohl Tür als auch Truhe freigeschaltet.

Ich gebe zwar zu, dass Quantum Locks ein schlechtes Beispiel sind, aber es zeigt das Konzept des Teilens von Objekten, anstatt überall Zustand und Verantwortung wiederherzustellen. Ein Beispiel aus der Praxis könnte ein Datenbankobjekt sein, das Sie mithilfe der Datenbank an Klassen übergeben .

Beachten Sie, dass die obigen Beispiele nicht zeigen, wie Sie zum Schloss einer Truhe oder einer Tür gelangen, um die Methoden lock()und zu unlock()verwenden. Ich überlasse dies als Übung, damit Sie trainieren können (oder jemand anderes hinzufügen kann).

Überprüfen Sie auch, wann Sie self over $ this verwenden sollen. für eine ausführlichere Erklärung von Klassen und Objekten und wie man mit ihnen arbeitet

Überprüfen Sie einige zusätzliche Ressourcen

Gordon
quelle
13

Ich weiß, dass Sie nach einer Ressource gefragt haben, nicht nach einer Erklärung, aber hier ist etwas, was ich unter der grundlegenden Implementierung von Klassen verstanden habe:

Stellen Sie sich Klasse als Vorlage für das Bauen vor. Eine grundlegende Skizze, wie ein Gebäude aussehen soll. Wenn Sie es tatsächlich erstellen, ändern Sie einige Dinge so, dass es so aussieht, als ob Ihr Client es wünscht (Eigenschaften im Falle einer Klasse ). Jetzt müssen Sie festlegen, wie sich die Dinge im Gebäude verhalten sollen ( Methoden ). Ich werde es an einem einfachen Beispiel zeigen.

Bauklasse:

/**
 * 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
    }
}

Klasse anrufen:

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

Kopieren Sie es einfach, führen Sie es auf Ihrem lokalen Host aus und versuchen Sie, einige Änderungen vorzunehmen. Bei Fragen einfach fragen. Wenn Sie dies nicht nützlich finden, verwenden Sie einfach die Links früherer Poster. Dies sind ziemlich solide Tutorials.

Ondrej Slinták
quelle
2

Um einen Blick aus einem anderen Blickwinkel zu bieten, wenn ich darf (basierend auf persönlichen Erfahrungen). Sie müssen "das Bedürfnis nach OOP" spüren, bevor Sie wirklich verstehen können, worum es geht - IMHO, Lernressourcen sollten danach kommen.

Man müsste im Grunde genommen in strukturellen Schwierigkeiten stecken bleiben, wenn man relativ große Software schreibt, die im prozeduralen Stil geschrieben ist (im Gegensatz zu objektorientiert, sorry, wenn jemand mit dem Begriff nicht einverstanden ist). Bis dahin könnte er / sie versuchen, den Code in Objekte umzustrukturieren, um ihn besser zu organisieren, und natürlich mehr über OOP im Detail erfahren. Auch dies ist meine persönliche Erfahrung und hat mich schneller zum Verständnis gebracht als jedes andere Buch.

Nur meine zwei Cent.

Jaya Wijaya
quelle
0

Klassen sind die Blaupausen von Objekten. Es gibt den Namen des Autos ist Klasse. Wir definieren die Variable und die Methode in der Klasse. Die Klasse wird mit den geschweiften Klammern definiert. Innerhalb der geschweiften Klammern können Sie die Variable, Methode, Eigenschaften und Funktion definieren. Funktion und Methode Beide sind gleich. Sie können die Methode definieren und die Variable ist die geschweifte Klammer der Klasse gemäß Ihren Anforderungen.

Klassenauto {

}}

foreach ( get_declared_classes () als $ class) {

echo ($class)."<br>";

}}

get_declared_classes () ist eine vordefinierte Funktion in php. Sie gibt ein Array der Namen der deklarierten Klassen zurück.

Geben Sie hier die Bildbeschreibung ein

Deepak Syal
quelle