Forum und email

Κλάσεις και αντικείμενα

Table of Contents

Κλάση

Μία κλάση (class) είναι μια συλλογή μεταβλητών και συναρτήσεων που δουλεύουν μ'αυτές τις μεταβλητές. Μία class ορίζεται σύμφωνα με την ακόλουθη σύνταξη:

<?php
class Cart
{
    var 
$items;  // Items in our shopping cart
   
    // Add $num articles of $artnr to the cart
 
    
function add_item ($artnr$num)
    {
        
$this->items[$artnr] += $num;
    }
   
    
// Take $num articles of $artnr out of the cart
 
    
function remove_item ($artnr$num)
    {
        if (
$this->items[$artnr] > $num) {
            
$this->items[$artnr] -= $num;
            return 
true;
        } else {
            return 
false;
        }   
    }
}
?>

Αυτό ορίζει μια class με το όνομα Cart η οποία αποτελείται από έναν συσχετιστικό πίνακα (associative array) από άρθρα στο καλάθι (cart) και δυο συναρτήσεις οι οποίες προσθέτουν και αφαιρούν αντικείμενα από το καλάθι.

Warning

ΔΕΝ μπορείτε να σπάσετε τον ορισμό μιας class definition σε πολλά αρχεία, ή πολλά PHP blocks. Το ακόλουθο δε θα δουλέψει:

<?php
class test {
?>
<?php
    function test() {
        print 'OK';
    }
}
?>

Οι ακόλουθες προτεινόμενες σημειώσεις ισχύουν για την PHP 4.

Caution

Το όνομα stdClass χρησιμοποιείται από την Zend και συνεπώς είναι δεσμευμένο. Δεν μπορείτε να έχετε κλάσεις με το όνομα stdClass στην PHP.

Caution

Οι συναρτήσεις με τα ονόματα __sleep και __wakeup είναι μαγικές κλάσεις της PHP. Δεν μπορείτε να έχετε συναρτήσεις με αυτά τα ονόματα σε καμία από τις κλάσεις σας εκτός και αν θέλετε να τις χρησιμοποιήσετε. Δείτε παρακάτω για περισσότερες πληροφορίες.

Caution

Η PHP δεσμεύει όλες τις συναρτήσεις που τα ονόματα τους αρχίζουν με το __ ως μαγικές. Συνιστάται να μην χρησιμοποιείτε συναρτήσεις με όνοματα που αρχίζουν από __ in PHP εκτός και αν θέλετε να χρησιμοποιήσετε τις μαγικές δυνατότητες τους.

Στην PHP 4, μόνο αρχικοποιήσεις με σταθερές επιτρέπονται για τις var μεταβλητές. Για να αρχικοποιήσετε μεταβλητές με μη-σταθερές τιμές, χρειάζεστε μια συνάρτηση αρχικοποίησης η οποία καλείται αυτόματα όταν ένα αντικείμενο δημιουργείται από μία κλάση. Μια τέτοια συνάρτηση καλείται constructor (δείτε παρακάτω).

<?php
/* None of these will work in PHP 4. */
class Cart
{
    var 
$todays_date date("Y-m-d");
    var 
$name $firstname;
    var 
$owner 'Fred ' 'Jones';
    var 
$items = array("VCR""TV");
}

/* This is how it should be done. */
class Cart
{
    var 
$todays_date;
    var 
$name;
    var 
$owner;
    var 
$items;

    function 
Cart()
    {
        
$this->todays_date date("Y-m-d");
        
$this->name $GLOBALS['firstname'];
        
/* etc. . . */
    
}
}
?>

Οι κλάσεις είναι τύποι, αυτό πραγματικά είναι, είναι σχεδιαγράμματα για τις πραγματικές μεταβλητές. Για να δημιουργήσετε μια μεταβλητή του επιθυμητού τύπου πρέπει να χρησιμοποιήσετε τον τελεστήnew.

<?php
$cart 
= new Cart;
$cart->add_item("10"1);

$another_cart = new Cart;
$another_cart->add_item("0815"3);
?>

Αυτό δημιουργεί τα αντικείμενα $cart και $another_cart, και τα δυο στην class Cart. Η συνάρτηση add_item() του $cart αντικειμένου καλείται για να προσθέσουμε 1 αντικείμενο του άρθρου με νούμερο 10 στο $cart. 3 αντικείμενα του άρθρου με νούμερο 0815 προστίθενται στην $another_cart.

Τόσο η $cart όσο και η$another_cart, έχουν τις συναρτήσεις add_item(), remove_item() και στοιχεία μεταβλητών. Αυτά είναι διακριτές συναρτήσεις και μεταβλητές. Μπορείτε να θεωρήσετε τα αντικείμενα ως κάτι παρόμοιο με τα directories σε ένα filesystem. Σε ένα filesystem μπορείτε να έχετε δυο διαφορετικά αρχεία README.TXT, με την προϋπόθεση ότι βρίσκονται σε διαφορετικά directories. Όπως και στα directories όπου πρέπει να πληκτρολογήσετε ολόκληρο το όνομα του path προκειμένου να προσπελάσετε ένα αρχείο από το αρχικό directory, έτσι πρέπει να προσδιορίσετε ολόκληρο το όνομα της συνάρτησης που θέλετε να καλέσετε: με όρους της PHP, το αρχικό directory θα είναι το global namespace, και το διαχωριστικό του ονόματος του path θα είναι το ->. Συνεπώς, τα ονόματα $cart->items και $another_cart->items κατονομάζουν δυο διαφορετικές μεταβλητές. Σημειώστε ότι η μεταβλητή ονομάζεται $cart->items, και όχι $cart->$items, το οποίο είναι όνομα μεταβλητής στην PHP αφού έχει το σύμβολο του δολαρίου.

<?php
// correct, single $
$cart->items = array("10" => 1); 

// invalid, because $cart->$items becomes $cart->""
$cart->$items = array("10" => 1);

// correct, but may or may not be what was intended:
// $cart->$myvar becomes $cart->items
$myvar 'items';
$cart->$myvar = array("10" => 1);  
?>

Κατά τον ορισμό μιας κλάσης, δεν γνωρίζετε με ποιο όνομα το αντικείμενο θα προσπελαύνεται από το πρόγραμμα σας. Τη στιγμή που γράφτηκε η κλάση Cart, ήταν άγνωστο ότι το αντικείμενο θα ονομαζόταν $cart ή $another_cartαργότερα. Συνεπώς, δεν μπορείτε να γράψετε την $cart->items μέσα στην ίδια την κλάση Cart. Αντίθετα, προκειμένου να προσπελάσετε τις συναρτήσεις της και τις μεταβλητές μέσα σε μια κλάση, μπορείτε να χρησιμοποιήσετε την ψευδομεταβλητή $this η οποία μπορεί να διαβαστεί ως 'το δικό μου' ή το 'τρέχον αντικείμενο'. Συνεπώς, η '$this->items[$artnr] += $num' μπορεί να διαβαστεί ως 'πρόσθεσε την $num στον μετρητή $artnr των δικών μου αντικειμένων του πίνακα' ή 'πρόσθεσε την $num στον μετρητή $artnr ου πίνακα αντικειμένων μέσα στο τρέχον αντικείμενο'.

Note: Υπάρχουν μερικές ωραίες συναρτήσεις που χειρίζονται κλάσεις και αντικείμενα. Ίσως θέλετε να ρίξετε μια ματιά στο Συναρτήσεις Κλάσεων/Αντικειμένων