Objektskloning

Från Wiki.linux.se
Version från den 19 augusti 2024 kl. 05.37 av Admin (diskussion | bidrag) (→‎Exempel #2 Komma åt medlem av ett nyklonat objekt)
(skillnad) ← Äldre version | Nuvarande version (skillnad) | Nyare version → (skillnad)
Hoppa till navigering Hoppa till sök

Kloning av objekt

Att skapa en kopia av ett objekt med fullständigt replikerade egenskaper är inte alltid önskvärt. Ett bra exempel på behovet av kopieringskonstruktorer är om du har ett objekt som representerar ett GTK-fönster och objektet håller resursen för detta GTK-fönster. När du skapar en dubblett kanske du vill skapa ett nytt fönster med samma egenskaper och låta det nya objektet hålla resursen för det nya fönstret. Ett annat exempel är om ditt objekt håller en referens till ett annat objekt som det använder, och när du replikerar huvudobjektet vill du skapa en ny instans av detta andra objekt så att replikan har sin egen separata kopia.

En kopia av ett objekt skapas genom att använda nyckelordet `clone` (som anropar objektets `__clone()`-metod om möjligt).

$kopia_av_objekt = clone $objekt;

När ett objekt klonas kommer PHP att utföra en grundläggande kopia av alla objektets egenskaper. Alla egenskaper som är referenser till andra variabler kommer att förbli referenser.

__clone(): void

När kloningen är klar, om en `__clone()`-metod är definierad, kommer den nyskapade objektets `__clone()`-metod att anropas för att möjliggöra eventuella nödvändiga ändringar av egenskaper.

Exempel #1 Kloning av ett objekt

<?php
class SubObject
{
    static $instances = 0;
    public $instance;

    public function __construct() {
        $this->instance = ++self::$instances;
    }

    public function __clone() {
        $this->instance = ++self::$instances;
    }
}

class MyCloneable
{
    public $object1;
    public $object2;

    function __clone()
    {
        // Tvinga en kopia av this->object, annars
        // kommer det att peka på samma objekt.
        $this->object1 = clone $this->object1;
    }
}

$obj = new MyCloneable();

$obj->object1 = new SubObject();
$obj->object2 = new SubObject();

$obj2 = clone $obj;

print "Originalobjekt:\n";
print_r($obj);

print "Klonat objekt:\n";
print_r($obj2);

?>

Exemplet ovan kommer att ge följande resultat:

Originalobjekt:
MyCloneable Object
(
    [object1] => SubObject Object
        (
            [instance] => 1
        )

    [object2] => SubObject Object
        (
            [instance] => 2
        )

)
Klonat objekt:
MyCloneable Object
(
    [object1] => SubObject Object
        (
            [instance] => 3
        )

    [object2] => SubObject Object
        (
            [instance] => 2
        )

)

Det är möjligt att komma åt en medlem av ett nyklonat objekt i ett enda uttryck:

Exempel #2 Komma åt medlem av ett nyklonat objekt

<?php
$dateTime = new DateTime();
echo (clone $dateTime)->format('Y');
?>

Exemplet ovan kommer att ge något liknande:

2016

Sidslut

Orginalhemsidan på Engelska : https://www.php.net/manual/en/language.oop5.cloning.php
PHP
Språkreferens
Språkreferens#Klasser_och_Objekt


Det här är en maskinöversättning av PHP-manualen till svenska. Om du hittar fel är vi tacksamma om du rapporterar dem via formuläret som finns på https://www.linux.se/kontaka-linux-se/