OOP - Object vs Static - Πότε χρησιμοποιώ το κάθε ένα ???

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
Άβαταρ μέλους
Lykos22
Δημοσιεύσεις: 89
Εγγραφή: 29 Μαρ 2011 16:28
Τοποθεσία: UK

OOP - Object vs Static - Πότε χρησιμοποιώ το κάθε ένα ???

Δημοσίευση από Lykos22 » 14 Φεβ 2013 15:47

Τις τελευταίες ημέρες μελετάω όλο και πιο εντατικά OO PHP και ενώ έχω "πιάσει" σε γενικές γραμμές την φιλοσοφία με τα objects μελετώντας μερικά παραδείγματα, μόλις μπήκα στο κεφάλαιο με τα static, άρχισα να ψιλοχάνομαι :( . Δεν αναφέρομαι στη σύνταξη του κώδικα, αλλά στο πότε τελικά πρέπει να δηλώνεις, και με τι κριτήρια, μία property ή function ως static και σε τι τελικά χρησιμεύει αυτό έναντι του object??

Οκ το static το χρησιμοποιείς όταν δεν έχεις κάποιο instance, όπως το object, αλλά αυτό τι σημαίνει δηλαδή στην πράξη?? Μπορεί να μου το εξηγήσει κάποιος με μερικά real-παραδειγματα?? Δεν έχω βρει κάποιο παράδειγμα που να έχει μια ολόκληρη static class, αντίθετα μια class έχει ορισμένες properties / functions δηλωμένες σαν static ενώ στη συνέχεια δημιουργούνται νέα instances από αυτή.

alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

OOP - Object vs Static - Πότε χρησιμοποιώ το κάθε ένα ???

Δημοσίευση από alou » 14 Φεβ 2013 17:27

Πιθανώς να μην είναι η καλύτερη απάντηση αλλά εγώ αυτή τη χρήση έχω στο μυαλό μου (μια και ζητάς παράδειγμα):

Ας πούμε ότι κάποιο class με όνομα freestuff έχει ένα και μοναδικό constructor και μπορεί να φτιάξει ένα μέλος είτε με όνομα είτε με email

Κώδικας: Επιλογή όλων

class Freestuffer {
    public function __construct($makeFreestufferFromNameOrEmail) { ... } 
}
Δεν θα ήταν καλύτερο να μπορούσες να φτιάξεις ένα μέλος και να το χειριστείς ανάλογα αν σου δώσει στειχεία email ή όνομα? ή για ακόμα μια πιο σύνθετη μέθοδο όπου πχ έρχεται συστημένος από κάπου?

Φτιάχνεις λοιπόν static functions για να το χειριστείς ανάλογα:

Κώδικας: Επιλογή όλων

class Freestuffer {
    private function __construct() { ... }
    public static function $makeFreestufferFromName($name) {
        $freestuffer = new Freestuffer();
        //και φτιάχνεις και το όνομά του
       $freestuffer->name = $name;
        return $freestuffer;
    }
}

μετά, καλείς τη στατική μέθοδο που σου ταιριάζει καλύτερα, πχ ας πούμε ότι τα δεδομένα σου έρχονται με ένα post από μια φόρμα που έχει post πεδία με όνομα, email και recomended by.

Αν βρεις ότι υπάρχει recomedation θα φτιαξεις τον τύπο με την αντίστοιχη μέθοδο:

Κώδικας: Επιλογή όλων

if ($_POST('recomended') {
$freestuffer = Freestuffer::makeFreestufferFromRecom('Bond, James', 'alou');//edw to deutero param einai as poume autos pou se systise
} else {
//αλλιώς ας πούμε με το όνομα
$freestuffer = Freestuffer::makeFreestufferFromName('Bond, James');
}
Νομίζω καταλαβαίνεις ότι λειτουργόντας έτσι μπορείς να χειριστείς πολύ ευκολότερα και χωρίς να επαναλαμβάνεις κώδικα διάφορες υποπεριπτώσεις δημιουργίας ενός αντικειμένου.

Αυτά από μένα :D

Άβαταρ μέλους
jpk
Δημοσιεύσεις: 441
Εγγραφή: 09 Μαρ 2011 21:17

OOP - Object vs Static - Πότε χρησιμοποιώ το κάθε ένα ???

Δημοσίευση από jpk » 14 Φεβ 2013 18:26

Γεια σου Lykos22,
Θα μοιραστώ κάποιες σκέψεις και απόψεις που αν όμως δεις ότι σε μπερδεύουν διέγραψε τες τελείως από το μυαλό σου. Αρχικά είμαι της άποψης να μην μπεις ακόμα στην χρήση static μεταβλητών ή συναρτήσεων. Ας γίνει πρώτα κτήμα σου το τι είναι προγραμματιστικά ένα αντικείμενο και μετά θα έρθει η ώρα για αυτό. Όταν λέω κτήμα σου δεν εννοώ μόνο να μάθεις τα βασικά , αλλά να φτιάξεις και κάποια μικρά έστω projects σε OOP. Υπάρχει ο κίνδυνος με την χρήση πολλών static να γράφεις functional programming σε μορφή OOP.

Ας δούμε μια κλάση ως τάξη , για να το απλοποιήσω πες ότι είναι η τάξη «Λύκος» , ξέρουμε εκ των προτέρων ότι κάθε λύκος όταν γεννιέται (instantiate ένα αντικείμενο «Λύκος» στην περίπτωσή μας) έχει ένα συγκεκριμένο πλήθος χαρακτηριστικών (π.χ. χρώμα) αλλά και συμπεριφορών (π.χ. ουρλιάζει , οπότε έχουμε μια συνάρτηση ούρλιαξε() που όταν την καλούμε ο λύκος μας ουρλιάζει). Μπορεί όμως και το χρώμα του λύκου να αλλάξει όσο μεγαλώνει , άρα έχουμε και μια μέθοδο για να ορίζουμε το χρώμα και να το ανακτάμε (ας πούμε getColor και setColor ).

Ο κάθε λύκος ξεχωριστά μπορεί να έχει διαφορετικές τιμές σε αυτές τις ιδιότητες του που είπαμε από την στιγμή που γεννηθεί. Αλλά ξέρουμε και κάτι για τους λύκους γενικά , ότι είναι σαρκοφάγοι άρα θα μπορούσαμε να έχουμε μια στατική ιδιότητα στην τάξη λύκος ας την πούμε διατροφή που θα μπορούσε να έχει εξ’ ορισμού την τιμή «σαρκοφάγος». Το ίδιο θα μπορούσαμε να πούμε για συμπεριφορές που δεν αφορούν κάθε λύκο ξεχωριστά αλλά τον λύκο ως είδος - τάξη.

Επιστρέφοντας στην ερώτηση σου αν υπάρχουν παραδείγματα τάξεων που να έχουν μόνο static θα σου δώσω το παράδειγμα των utilities classes. Βλέπε
http://en.wikipedia.org/wiki/Utility_class έχει ένα παράδειγμα σε Java αν και η απλούστερο σε Java είναι η StringUtils. Είναι τάξεις που έχουν στατικές μεθόδους – συναρτήσεις ώστε να πραγματοποιούν κοινές λειτουργίες με βάση ένα αντικείμενο και άλλα ορίσματα. Φυσικά μπορεί να σου γεννηθεί η απορία γιατί δεν είναι συμπεριφορά του αντικειμένου , αλλά θα πάρει κάποιο καιρό να ξεχωρίζεις το τι είναι συμπεριφορά ενός αντικειμένου και τι λειτουργία πάνω στο αντικείμενο . Ως τότε μείνε στις συμπεριφορές – μεθόδους στα πλαίσια του ίδιου του αντικειμένου .

Άβαταρ μέλους
Lykos22
Δημοσιεύσεις: 89
Εγγραφή: 29 Μαρ 2011 16:28
Τοποθεσία: UK

OOP - Object vs Static - Πότε χρησιμοποιώ το κάθε ένα ???

Δημοσίευση από Lykos22 » 15 Φεβ 2013 13:14

Καταρχήν ευχαριστώ και τους δυο σας που μπήκατε στον κόπο να γράψετε.

Αυτό που έχω καταλάβει μέχρι στιγμής περί του OOP, και διορθώστε με αν έχω κάπου λάθος, είναι το εξής:

Ας υποθέσουμε πως έχουμε ένα site - forum. Κάθε χρήστης αποτελεί instance πχ της class User, άρα έχει κάποια properties πχ name, username, password, email κλπ κλπ και μπορεί κάνει εγγραφή μέσω μίας method register(), login μέσω μιας login() κλπ κλπ, αφού κάθε χρήστης διαφέρει ως προς αυτά (διαφορετικό email, username κλπ κλπ). Επίσης τo σχόλιο που γράφει αποτελεί instance μιας class Comment κοκ.

Υπάρχει όμως και μία class (θα την πω) CommonThings η οποία περιέχει κάποια static "κοινά" χαρακτηριστικά των προηγούμενων 2. πχ μπορεί να έχει μια static function select_all() στην οποία αν την της δώσεις το όνομα του πίνακα (users ή comments) να σου επιστρέφει τις όλες τις αντίστοιχες εγγραφές, ομοίως μια static function select_by_id($id) αν της δώσεις το όνομα του πίνακα, σου επιστρέφει την εγγραφή με το συγκεκριμένο id. Απλά αντί αυτές τις λειτουργίες να τις έχεις σε κάθε class ξεχωριστά, έχεις μία class όπου μπορείς να μαζέψεις όλα τα κοινά χαρακτηριστικά των υπόλοιπων και τα έχεις ως static. Κατά κάποιο τρόπο δηλαδή είναι κάτι αντίστοιχο σαν τις functions που έχεις σε procedure PHP και τις χρησιμοποιείς όποτε θες (ενδεχομένως να είναι και αυτό που ανέφερες jpk).

Το "έχω" ή είμαι τελείως λάθος :-? ??? :P

Άβαταρ μέλους
mrpc
WebDev Moderator
Δημοσιεύσεις: 3393
Εγγραφή: 03 Μάιος 2000 03:00
Τοποθεσία: Εξάρχεια
Επικοινωνία:

OOP - Object vs Static - Πότε χρησιμοποιώ το κάθε ένα ???

Δημοσίευση από mrpc » 15 Φεβ 2013 18:52

Για εμένα το πιο πρακτικό θα ήταν π.χ. να έχεις ένα static function getAllUsers μέσα στην κλάση user και μια static function getAllComments μέσα στην comments. Γιατί να τις βάλεις αυτές σε μια τρίτη κλάση; Μου φαίνεται πιο πολύπλοκο, χωρίς λόγο.

Από την άλλη, αν υπάρχουν κοινά χαρακτηριστικά των δύο κλάσεων, αυτά δεν τα βάζεις σε μια τρίτη ως static, αλλά φτιάχνεις μια parent κλάση την οποία υιοθετούν η user και η comment.

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

OOP - Object vs Static - Πότε χρησιμοποιώ το κάθε ένα ???

Δημοσίευση από cherouvim » 15 Φεβ 2013 19:13

mrpc έγραψε:Για εμένα το πιο πρακτικό θα ήταν π.χ. να έχεις ένα static function getAllUsers μέσα στην κλάση user και μια static function getAllComments μέσα στην comments. Γιατί να τις βάλεις αυτές σε μια τρίτη κλάση; Μου φαίνεται πιο πολύπλοκο, χωρίς λόγο.
Ένας λόγος είναι οτι μπορεί να μην θέλεις να μην μπλέξεις το μοντέλο σου με το κομμάτι της εφαρμογής που ασχολείται με το persistence (βάση, xml ή οτιδήποτε).

Άβαταρ μέλους
mrpc
WebDev Moderator
Δημοσιεύσεις: 3393
Εγγραφή: 03 Μάιος 2000 03:00
Τοποθεσία: Εξάρχεια
Επικοινωνία:

OOP - Object vs Static - Πότε χρησιμοποιώ το κάθε ένα ???

Δημοσίευση από mrpc » 15 Φεβ 2013 19:28

Ναι, εξαρτάται και από το pattern που χρησιμοποιείς, τη λογική σου γενικότερα. Αυτό που είπα, το είπα υποθέτοντας ότι μέσα στην κλάση έχει ήδη ανάλογα Methods (π.χ. στο register που αναφέρθηκε υποθέτω ότι κάνει και την εγγραφή στη βάση).

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

OOP - Object vs Static - Πότε χρησιμοποιώ το κάθε ένα ???

Δημοσίευση από gvre » 15 Φεβ 2013 20:43

Ένα παράδειγμα static property θα μπορούσε να είναι ένας μετρητής για τα instances μιας κλάσης.

Κώδικας: Επιλογή όλων

class A
{
        private static $cnt = 0;
        private static $max = 2;

        public function __construct()
        {
                if (self::$cnt == self::$max)
                        throw new Exception("Max limit is 2");
                self::$cnt++;
        }

        public static function total()
        {
                return self::$cnt;
        }
}

echo 'Total: ' . A::total() . "\n";
$v1 = new A;
$v2 = new A;
//$v3 = new A;
echo 'Total: ' . A::total() . "\n";
Από static methods ΔΕ μπορείς να προσπελάσεις non-static methods και μεταβλητές. Δε μπορείς δηλαδή να έχεις κάτι σαν το παρακάτω.

Κώδικας: Επιλογή όλων

class A
{
        private $foo;
        public function __construct() { }

        public static function bar()
        {
                echo $this->foo;
        }
}

A::bar();

Άβαταρ μέλους
jpk
Δημοσιεύσεις: 441
Εγγραφή: 09 Μαρ 2011 21:17

OOP - Object vs Static - Πότε χρησιμοποιώ το κάθε ένα ???

Δημοσίευση από jpk » 15 Φεβ 2013 20:52

Lykos22 έγραψε:Το "έχω" ή είμαι τελείως λάθος :-? ??? :P
Lykos22
Για εμένα κάπου το έχεις - κάπου δεν το έχεις , αλλά όπως και να έχει μην σε αγχώνει αυτό , διάλεξες και ένα OOP θέμα που και χρόνια προγραμματιστές τα κάνουν συχνά θάλασσα. Σου επαναλαμβάνω την άποψή μου ότι μείνε προς το παρών στο να γίνει κτήμα σου ο αντικειμενοστρεφής προγραμματισμός με κάποια (έστω μικρά) δικά σου projects και στην πορεία θα σου έρθει από μόνη της φυσικά η διαφοροποίηση των ιδιοτήτων και συμπεριφορών της τάξης (στατικών) από αυτών των αντικειμένων αυτής (instances). (edit: πολύ καθαρό και το παράδειγμα που έδωσε ο gvre σε αυτό)

Λες
Lykos22 έγραψε:Υπάρχει όμως και μία class (θα την πω) CommonThings η οποία περιέχει κάποια static "κοινά" χαρακτηριστικά των προηγούμενων 2. πχ μπορεί να έχει μια static function select_all() στην οποία αν την της δώσεις το όνομα του πίνακα (users ή comments) να σου επιστρέφει τις όλες τις αντίστοιχες εγγραφές, ομοίως μια static function select_by_id($id) αν της δώσεις το όνομα του πίνακα, σου επιστρέφει την εγγραφή με το συγκεκριμένο id. Απλά αντί αυτές τις λειτουργίες να τις έχεις σε κάθε class ξεχωριστά, έχεις μία class όπου μπορείς να μαζέψεις όλα τα κοινά χαρακτηριστικά των υπόλοιπων και τα έχεις ως static
Σε αυτό θα συμφωνήσω με τον mrpc , αν τα αντικείμενά σου έχουν κάποιες κοινές ιδιότητες και / ή συμπεριφορές τότε μιλάμε για απλή κληρονομικότητα.

Για εμένα είναι δείγμα ποιότητας κώδικα σε OOP η μη εκτεταμένη χρήση static ιδιοτήτων και συμπεριφορών. Πολύ συχνά κάποιος μαθαίνει κάποιο pattern που έχει σχέση με static και το χρησιμοποιεί εκεί που δεν έχει λόγο , αναφέρθηκε το factory pattern για να μην προσθέσω και την απίστευτη κατάχρηση του singleton μέσα από την οποία μια χαρά μπερδεμένο functional κώδικα μπορείς να γράψεις καμουφλαρισμένο σε OOP. Για εμένα στον OOP τα επίπεδα μια εφαρμογής πρέπει να είναι απολύτως ξεκαθαρισμένα όπως και η καθαρότητα της φύσης ενός αντικειμένου. Μην ανησυχείς θα έρθει η ζωή και οι προδιαγραφές και θα μπερδέψουν το πράγμα στην πορεία, αλλά αν το έχεις κουβάρι από την αρχή δεν πρόκειται να βρεις άκρη.

Άβαταρ μέλους
nirvana
Δημοσιεύσεις: 241
Εγγραφή: 01 Σεπ 2005 18:28
Τοποθεσία: Αγ. Παρασκευή

OOP - Object vs Static - Πότε χρησιμοποιώ το κάθε ένα ???

Δημοσίευση από nirvana » 16 Φεβ 2013 04:20

To static einai ena thema pou mperdevei arketa.
Auto nomizw einai ena kalo paradeigma pou eksigei polla:

stackoverflow.com/questions/2671496/java-when-to-use-static-methods

Gekina opoia methodos einai logiko na mpei se mia klasi, alla einai episis logiko na min xreiazetai na kaneis instance kapoio object mporei na ginei static.

P.x. Estw oti theleis na ftiakseis mia klasi pou na ftiaxnei ena mysql query me object oriented tropo tou styl:

Κώδικας: Επιλογή όλων

$query = new MySql_Query;
$query->select('id')->from('table')->where('id = ' . MySql_Query::escape($id));
Se auto to paradeigma tha eixame tin klasi Mysql_Query me tis methodous select,from kai where kai static tin escape.

(Apla na episimanw oti autos den einai o kalyteros tropos na ylopoiisoume tin klasi etsi. Einai pros xarin aplopoiisis)

Άβαταρ μέλους
Lykos22
Δημοσιεύσεις: 89
Εγγραφή: 29 Μαρ 2011 16:28
Τοποθεσία: UK

OOP - Object vs Static - Πότε χρησιμοποιώ το κάθε ένα ???

Δημοσίευση από Lykos22 » 16 Φεβ 2013 11:53

Στο παράδειγμα που ανέφερα πιο πριν, βασικά έχετε δίκιο απλά ξέχασα και εγώ να το αναφέρω, η 3η class μου θα είναι σίγουρα parent, άρα εκεί μπαίνει στο παιχνίδι και η κληρονομικότητα και σίγουρα παίζει και κάποιο ρόλο και το pattern που χρησιμοποιείς.
nirvana έγραψε:To static einai ena thema pou mperdevei arketa.
Auto nomizw einai ena kalo paradeigma pou eksigei polla:

stackoverflow.com/questions/2671496/java-when-to-use-static-methods

Gekina opoia methodos einai logiko na mpei se mia klasi, alla einai episis logiko na min xreiazetai na kaneis instance kapoio object mporei na ginei static.
Εαν πάρω και σαν παράδειγμα την απάντηση του τύπου που έχει δώσει την 1η απάντηση με το τικ ("One rule-of-thumb: ask yourself "does it make sense to call this method, even if no Obj has been constructed yet?" If so, it should definitely be static.") τότε να υποθέσω πως ένας γενικός κανόνας θα μπορούσε να είναι:
- όλες όσες μέθοδοι (άρα και κάποιες properties) που ανηκουν σε μία class, αλλά δεν έχουν (άμεση) σχέση με τον τρόπο λειτουργίας και συμπεριφοράς του αντικειμένου μπορούν να είναι static. Δηλαδή η function getAllUsers είναι static επειδή δεν έχει κάποια σχέση με το πως λειτουργεί το αντικειμένο όπως έχει μια public function login(), απλά επιστρέφει όλους τους users και ανήκει απλά στην "ομάδα" Users.
jpk έγραψε: Lykos22
Για εμένα κάπου το έχεις - κάπου δεν το έχεις , αλλά όπως και να έχει μην σε αγχώνει αυτό , διάλεξες και ένα OOP θέμα που και χρόνια προγραμματιστές τα κάνουν συχνά θάλασσα. Σου επαναλαμβάνω την άποψή μου ότι μείνε προς το παρών στο να γίνει κτήμα σου ο αντικειμενοστρεφής προγραμματισμός με κάποια (έστω μικρά) δικά σου projects και στην πορεία θα σου έρθει από μόνη της φυσικά η διαφοροποίηση των ιδιοτήτων και συμπεριφορών της τάξης (στατικών) από αυτών των αντικειμένων αυτής (instances). (edit: πολύ καθαρό και το παράδειγμα που έδωσε ο gvre σε αυτό)
Έχεις δίκιο σε αυτό και σίγουρα δεν είναι κάτι εύκολο, δεν θέλω να γίνουν όλα ένα μπερδεμένο κουβάρι, απλά κοιτάω να μπουν κάποια θεμέλια σιγά-σιγά όπως η γενική ιδέα και μετά ερχονται και τα υπόλοιπα.

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

OOP - Object vs Static - Πότε χρησιμοποιώ το κάθε ένα ???

Δημοσίευση από cherouvim » 16 Φεβ 2013 12:21

Lykos22 έγραψε:..., αλλά δεν έχουν (άμεση) σχέση με τον τρόπο λειτουργίας και συμπεριφοράς του αντικειμένου μπορούν να είναι static.
Όχι. Static είναι αυτές που δεν έχουν σχέση με ένα συγκεκριμένο στιγμιότυπο (instance) αλλά σίγουρα έχουν σχέση με τη λειτουργία και συμπεριφορά της κλάσης, γιαυτό άλλωστε και μπαίνουν μέσα στην κλάση.

Πχ μια hashPassword(String) μπαίνει εύκολα ως static πάνω στο class User όταν θέλουμε να hashάρουμε password για χρήστες ακόμα και όταν δεν έχουμε στιγμιότυπο χρήστη στο χέρι μας.

Άβαταρ μέλους
Lykos22
Δημοσιεύσεις: 89
Εγγραφή: 29 Μαρ 2011 16:28
Τοποθεσία: UK

OOP - Object vs Static - Πότε χρησιμοποιώ το κάθε ένα ???

Δημοσίευση από Lykos22 » 16 Φεβ 2013 14:07

@cherouvim: αυτό ακριβώς ήθελα να πω :wink: ! Μπορεί να ανήκει δηλαδή στην class User, αλλά δεν είναι κάποια ενέργεια-λειτουργία που κάνει ο κάθε user, όπως κάνει η συνάρτηση ούρλιαξε() στο αντίστοιχο παράδειγμα του jpk που ανέφερε τους λύκους.


Σωστά???

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

OOP - Object vs Static - Πότε χρησιμοποιώ το κάθε ένα ???

Δημοσίευση από cherouvim » 16 Φεβ 2013 14:55

Ναι, σωστά.

Άβαταρ μέλους
Lykos22
Δημοσιεύσεις: 89
Εγγραφή: 29 Μαρ 2011 16:28
Τοποθεσία: UK

OOP - Object vs Static - Πότε χρησιμοποιώ το κάθε ένα ???

Δημοσίευση από Lykos22 » 18 Φεβ 2013 09:48

Επίσης έχω δει πολλά, για να μην πω σχεδόν όλα, παραδείγματα όπου developers φτιάχνουν μία class Database όπου εκεί γίνεται η σύνδεση με τη β.δ. κυρίως, εκτελούνται queries κλπ κλπ, και δημιουργούν ένα instance από τη Database. Στην ίδια λογική δεν θα 'πρεπε κανονικά και αυτή να είναι static ?? :-?

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες