Forum und email

Constructors

Caution

Στην PHP 3 και στην PHP 4 οι constructors συμπεριφέρονται διαφορετικά. Στην PHP 4 προτιμούνται τα semantics.

Οι constructors είναι συναρτήσεις σε μια κλάση που καλούνται αυτόματα όταν δημιοργείτε ένα καινούριο στιγμιότυπο (instance) μιας κλάσης με την new. Στην PHP 3, μια συνάρτηση γίνεται constructor όταν έχει το ίδιο όνομα με την κλάση. Στην PHP 4, μια συνάρτηση γίνεται constructor, όταν έχει το ίδιο όνομα με την κλάση όπως αυτή ορίζεται - η διαφορά είναι μικρή, αλλά σημαντική (δείτε παρακάτω).

<?php
// Works in PHP 3 and PHP 4.
class Auto_Cart extends Cart
{
    function 
Auto_Cart()
    {
        
$this->add_item ("10"1);
    }
}
?>

Το παραπάνω ορίζει την κλάση Auto_Cart η οποία είναι η Cart με επιπλέον έναν constructor ο οποίος αρχικοποιεί το cart με ένα στοιχείο από το άρθρο με νούμερο "10" κάθε φορά που ένα νέο Auto_Cart δημιουργείται με την "new". Οι Constructors μπορούν να πάρουν παραμέτρους και αυτές οι παράμετροι μπορούν να είναι προαιρετικές, γεγονός το οποίο τις κάνει πιο χρήσιμες. Για να αποκτήσουμε τη δυνατότητα να χρησιμοποιούμε την κλάση χωρίς παραμέτρους, όλες οι παράμετροι στους constructors πρέπει να γίνουν προαιρετικές παρέχοντας τις προκαθορισμένες τιμές.

<?php
// Works in PHP 3 and PHP 4.
class Constructor_Cart extends Cart
{
    function 
Constructor_Cart($item "10"$num 1)
    {
        
$this->add_item ($item$num);
    }
}
 
// Shop the same old boring stuff.
 
$default_cart = new Constructor_Cart;
 
// Shop for real...
 
$different_cart = new Constructor_Cart("20"17);
?>

Μπορείτε επίσης να χρησιμοποιήσετε τον τελεστή @ για να σταματήσετε (mute) την εμφάνιση λαθών που συμβαίνουν στους constructor, π.χ. @new.

Caution

Στην PHP 3, οι προκύπτουσες κλάσεις και οι constructors έχουν ένα πλήθος περιορισμών. Τα ακόλουθα παραδείγματα θα πρέπει να διαβαστούν προσεκτικά για να γίνουν κατανοητοί αυτοί οι περιορισμοί.

<?php
class A
{
    function 
A()
    {
      echo 
"I am the constructor of A.<br>\n";
    }
}

class 
extends A
{
    function 
C()
    {
        echo 
"I am a regular function.<br>\n";
    }
}

// no constructor is being called in PHP 3.
$b = new B;
?>

Στην PHP 3, δεν καλείται κανένας constructor στο παραπάνω παράδειγμα. Ο κανόνας στην PHP 3 είναι: 'Ένας constructor είναι μια συνάρτηση του ίδιου ονόματος με την κλάση.'. Το όνομα της κλάσης είναι B, και δεν υπάρχει συνάρτηση με το όνομα B() στην κλαση B. Τίποτα δεν συμβαίνει.

Αυτό έχει διορθωθεί στην PHP 4 εισάγοντας έναν άλλο κανόνα: Αν μια κλάση δεν έχει constructor, ο constructor της βασικής κλάσης καλείται, αν αυτός υπάρχει. Το παραπάνω παράδειγμα θα είχε εκτυπώσει 'I am the constructor of A.<br>' στην PHP 4.

<?php
class A
{
    function 
A()
    {
        echo 
"I am the constructor of A.<br>\n";
    }

    function 
B()
    {
        echo 
"I am a regular function named B in class A.<br>\n";
        echo 
"I am not a constructor in A.<br>\n";
    }
}

class 
extends A
{
    function 
C()
    {
        echo 
"I am a regular function.<br>\n";
    }
}

// This will call B() as a constructor.
$b = new B;
?>

Στην PHP 3, η συνάρτηση B() στην κλαση A θα γίνει ξαφνικά constructor στην κλάση B, παρόλο που δεν υπήρξε ποτέ η πρόθεση να γίνει αυτό. Ο κανόνας στην PHP 3 είναι: 'Ένας constructor είναι μια συνάρτηση με το ίδιο όνομα με την κλάση.'. Η PHP 3 δεν ενδιαφέρεται αν η συνάρτηση ορίζεται στην κλάση B, ή αν έχει κληρονομηθεί.

Αυτό έχει διορθωθεί στην PHP 4 αλλάζοντας τον κανόνα σε: 'Ένας constructor είναι μια συνάρτηση του ίδιου ονόματος με την κλάση στην οποία ορίστηκε.'. Συνεπώς στην PHP 4, η κλάση B δε θα έχει συνάρτηση για δημιουργία constructor από μόνη της και ο constructor της βασικής κλάσης θα κληθεί, εκτυπώνοντας το 'I am the constructor of A.<br>'.

Caution

Ούτε η PHP 3 ούτε η PHP 4 καλούν constructors της βασικής κλάσης αυτόματα από ένα constructor κλάσης που έχει παραχθεί. Είναι δική σας ευθύνη να περάσετε την κλήση στους constructors όπου χρειάζεται.

Note: Δεν υπάρχουν destructors στην PHP 3 ή στην PHP 4. Μπορείτε να χρησιμοποιήσετε την register_shutdown_function() αντ'αυτού προκειμένου να προσομοιώσετε το αποτέλεσμα των destructors.

Οι Destructors είναι συναρτήσεις που καλούνται αυτόματα όταν ένα αντικείμενο καταστρέφεται, είτε με την unset() ή απλά βγάζοντας εκτός εμβέλειας. Δεν υπάρχουν destructors στην PHP.