OOP Προγραματισμος και διαμοιρασμός αντικειμενων

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

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

Απάντηση
Άβαταρ μέλους
christos312
Δημοσιεύσεις: 126
Εγγραφή: 13 Νοέμ 2005 22:13
Επικοινωνία:

OOP Προγραματισμος και διαμοιρασμός αντικειμενων

Δημοσίευση από christos312 » 05 Δεκ 2013 10:04

Γεια σε ολους,

εχω μια ερωτηση οσων αφορα το OOP στην PHP και το πως μπορω να κανω share object μεταξυ πολλων αρχειων PHP.

Εχω δημιουργησει μια Class user.php η οποια περιεχει πληροφοριες για ενα User οπως επισης καποια Setters και getters.

Τωρα στο login.php οταν τα στοιχεια ειναι σωστα και ο χρηστης υπαρχει θελω να κανω instantiate αυτη τη class

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

global $loggenInUser;
$loggenInUser = new UserInfo()
Ουτως ωστε να μπορω να εχω reference και σε αλλα αρχεια του κωδικα.

Αυτο ομως δεν εχω καταφερει να το κανω γιατι απο τι διαβασα μολις το script τελειωσει ολα διαγράφονται, σωστα;;

Η ερωτηση μου ειναι με πιο τροπο μπορω να κανω τετοια πραγμα;

Δηλαδη μολις κανει login ο χρηστης να δημιουργησω ενα αντικειμενο και αυτο το αντικειμενο να μπορω να το χρησιμοποιω σε αλλα αρχεια php για να παρω διαφορες πληροφοριες για τον χρηστη πχ

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

$$loggenInUser->getUsername();
$loggenInUser->getAccessAllowed();
...
...

Σημειωστε οτι δοκιμασα να βαλω το αντικειμενο σε $SESSION αλλα διαβασα οτι αυτο δεν ειναι και η καλυτερη πρακτικη

Εσεις τι προτεινετε;; :wink:

Ευχαριστω για το χρονο σας.
Εικόνα
"All This Has Happened Before And It Will Happen Again.."
Battlestar Galactica RULEZZ

geomagas
Δημοσιεύσεις: 667
Εγγραφή: 06 Απρ 2013 13:36
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

OOP Προγραματισμος και διαμοιρασμός αντικειμενων

Δημοσίευση από geomagas » 05 Δεκ 2013 10:34

Το new UserInfo() κάνει allocate μνήμη δυναμικά, η οποία απελευθερώνεται όταν τελειώσει η εκτέλεση του script.
Αυτός είναι και ο λόγος που δεν μπορείς να το αποθηκεύσεις στο session: Στο επόμενο request το αντικείμενο θα έχει γίνει dispose και ο "δείκτης" που θα έχεις αποθηκεύσει θα δείχνει στο υπερπέραν.

Θα πρέπει να κάνεις instantiate το αντικείμενο σε κάθε request.
Αν θέλεις σώνει και καλά να το αποθηκεύσεις στο session (ή κάπου αλλού), θα πρέπει να το κάνεις πρώτα serialize.
Αλλά και πάλι, για να το χρησιμοποιήσεις στο επόμενο request, θα πρέπει να το κάνεις unserialize...

Άβαταρ μέλους
christos312
Δημοσιεύσεις: 126
Εγγραφή: 13 Νοέμ 2005 22:13
Επικοινωνία:

OOP Προγραματισμος και διαμοιρασμός αντικειμενων

Δημοσίευση από christos312 » 05 Δεκ 2013 14:11

Ευχαριστω για τη απαντηση.

Μαλιστα, οκ θα το κοιταξω.

Παραδειγμα ομως, τα μεγαλα συστηματα με PHP πχ Wordpress πως το κανουν; Πως κρατανε τα data του user σε ολο το site;;

Ρωτουν σε καθε αρχειο τα στοιχεια απο την DB;
Εικόνα
"All This Has Happened Before And It Will Happen Again.."
Battlestar Galactica RULEZZ

geomagas
Δημοσιεύσεις: 667
Εγγραφή: 06 Απρ 2013 13:36
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

OOP Προγραματισμος και διαμοιρασμός αντικειμενων

Δημοσίευση από geomagas » 05 Δεκ 2013 15:13

Σε κάθε αρχείο, όχι.
Σε κάθε request... μάλλον ναι.
Αν όχι από τη ΒΔ, τουλάχιστον από κάποιο σημείο που έχουν αποθηκευτεί, για να τα βρει στο επόμενο request.

Αλλά το php object σίγουρα δημιουργείται εξ αρχής σε κάθε request (τουλάχιστον σε αυτά που χρειάζεται).

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

OOP Προγραματισμος και διαμοιρασμός αντικειμενων

Δημοσίευση από gvre » 05 Δεκ 2013 19:36

christos312 έγραψε:Ευχαριστω για τη απαντηση.

Μαλιστα, οκ θα το κοιταξω.

Παραδειγμα ομως, τα μεγαλα συστηματα με PHP πχ Wordpress πως το κανουν; Πως κρατανε τα data του user σε ολο το site;;

Ρωτουν σε καθε αρχειο τα στοιχεια απο την DB;
Μπορείς να κρατήσεις στο session το username ή/και το userId του χρήστη και βάσει αυτών να ζητάς από τη βάση ό,τι χρειάζεσαι (δικαιώματα, κλπ). Επίσης, καλό είναι να αποφεύγεις τη χρήση global μεταβλητών.

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

OOP Προγραματισμος και διαμοιρασμός αντικειμενων

Δημοσίευση από jpk » 12 Δεκ 2013 23:33

Δεν υπάρχει λόγος για να κάνει κάποιος προγραμματιστικά serialize και unserialize κάθε φορά που θέλει να χρησιμοποιήσει το session για ένα αντικείμενο. Αρκεί καλή χρήση της spl_autoload_register πλέον πριν το session_start. Η PHP από μόνη της θα προσπαθήσει να το κάνει έχοντας το αντικείμενο στο session , το να το κάνεις serialize και unserialize προγραμματιστικά έχει νόημα μόνο όταν αποτυγχάνει αυτή η διαδικασία που δεν βλέπω λόγο γιατί.

Παράδειγμα

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

<?php
header&#40;'Content-Type&#58; text/html; charset=utf-8'&#41;; 
class bicycle
&#123;
  private $gear; 
  
  public function setGear&#40;$gear&#41;
  &#123;
    $this->gear = $gear; 
  &#125;
  
  public function getGear&#40;&#41;
  &#123;
    return $this->gear;
  &#125;
&#125;

session_start&#40;&#41;;
if&#40; !isset&#40;$_SESSION&#91;"MY_BICYCLE"&#93;&#41; &#41;
&#123;
  $myBicycle = new bicycle&#40;&#41;;
  $myBicycle->setGear&#40;5&#41;; 
  $_SESSION&#91;"MY_BICYCLE"&#93; = $myBicycle; 
  echo "Έκανα set στο session ότι η ταχύτητα του ποδηλάτου μου είναι ".$myBicycle->getGear&#40;&#41;;
&#125;
else 
&#123;
  $myBicycle = $_SESSION&#91;"MY_BICYCLE"&#93;;
  echo "Η ταχύτητα του ποδηλάτου μου είναι ".$myBicycle->getGear&#40;&#41;;
&#125;
?>
Ο πυρήνας το ερωτήματός σου δεν είναι sharing ενός object μεταξύ διαφορετικών αρχείων PHP (Που μια χαρά θα μπορούσαν να συνυπάρχουν σε ένα request και να μοιράζονται το αντικείμενο ή ακόμα καλύτερα να περνάνε το αντικείμενο ως μεταβλητή από μια κλάση σε άλλη) αλλά πως γίνεται το caching σε PHP.

Εδώ υπάρχουν χίλιες μια θεωρίες που όλες έχουν να κάνουν με το τι προσπαθείς τελικά να κάνεις και αν έχει νόημα τελικά η συγκεκριμένη πληροφορία να γίνει caching με οποιοδήποτε τρόπο. Όπως είπαμε υπάρχει το caching από πλευράς επίσκεψης (χωρίς να μεταφέρεις το resource id του αντικειμένου , αναδομείτε το αντικείμενο σε κάθε request για τον συγκεκριμένο επισκέπτη), αυτό έχει νόημα για αντικείμενα που έχουν να κάνουν με τον επισκέπτη. Έπειτα υπάρχει το caching σε αρχείο που έχει νόημα για αντικείμενα που έχουν να κάνουν με την εφαρμογή και αλλάζουν σπάνια (π.χ. μέσα από κάποιο admin), αν έχουμε υπερβολικές κλήσεις αυτού του αρχείου (ή αρχείων) τότε έχει νόημα να είναι σε RAM Disk (filesystem σε RAM ) . Και στις δύο περιπτώσεις , το πιθανότερο η πηγή των δεδομένων είναι να είναι μια βάση δεδομένων (εκτός αν είναι web service ή κάτι άλλο) &#8230; Και εκεί η PHP έχει τρόπους για caching όπου υπάρχει λόγος όπως να κρατήσεις ανοιχτή μια PDO connection μεταξύ requests. (Φυσικά prepared statements , εκτός από κάποια ασφάλεια βοηθάμε και την απόδοση της βάσης μας)

Ανέφερα επιγραμματικά μόνο τα βασικά υπάρχουν ένα σορό ακόμα και πολλά εξωτικά στο caching που θεωρητικά κάποια έχουν νόημα , και κάποια στην πράξη δεν λειτουργούν , αλλά το ερώτημα είναι γιατί θέλεις να το κάνεις , ανάλογα θα επιλέξεις.

(Απλά να σημειώσω ότι στο παράδειγμα το λογικό «λάθος» IF NOT &#8211; ELSE αντί για IF &#8211; ELSE που είναι και το λογικά ορθότερο το έκανα για να δείξω την ροή, φυσικά και θα έπρεπε να είναι αντίστροφο.)

javment
Δημοσιεύσεις: 25
Εγγραφή: 02 Οκτ 2010 01:02
Επικοινωνία:

OOP Προγραματισμος και διαμοιρασμός αντικειμενων

Δημοσίευση από javment » 14 Δεκ 2013 10:11

Διάβασε και το singleton design pattern σου επιτρέπει να δημιουργείς κάθε φορά μόνο ένα instance της κλάσης και να το καλέις από όποιοδήποτε σημείο/αρχείο θες το μοναδικό αυτό instance.
πχ

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

class User &#123;

    private static $instance;

    private function __construct&#40;&#41;&#123;&#125;

    static function getInstance&#40;&#41; &#123;
        if&#40;!isset&#40;self&#58;&#58;$instance&#41;&#41;
            self&#58;&#58;$instance = new __CLASS__;

        return self&#58;$instance;
    &#125;

&#125;


και αφού έχεις κάνει include το αρχείο της κλάσης μπορείς να το καλέις ως

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

$user = User&#58;&#58;getInstance&#40;&#41;;

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

OOP Προγραματισμος και διαμοιρασμός αντικειμενων

Δημοσίευση από jpk » 14 Δεκ 2013 12:45

Διάβασε και το singleton design pattern και χρησιμοποίησέ το μετά από 2 &#8211; 3 χρόνια που γράφεις καθαρά αντικειμενοστραφή κώδικα. Αλλιώς υπάρχει το σοβαρό ενδεχόμενο να γράφεις κακό procedural (ούτε καν functional) με μανδύα OOP και να νομίζεις ότι γράφεις και object oriented και καλά. ( Είναι ελάχιστες οι περιπτώσεις που χρειάζονται patterns σχετικά με το singleton στον OOP &#8230; τόσο ελάχιστες που τις συναντάς μια φορά τον χρόνο και ούτε &#8230; φυσικά τα pattern είναι αυτό που λέει η λέξη &#8230; δεν υπάρχει περίπτωση να τα χρησιμοποιήσεις αυτούσια εκτός αν αντιγράφεις από βιβλίο &#8230; )

(μιας και μου αρέσει να αποδεικνύω αυτά που λέω μένει ένα performance test μεταξύ του να κάνεις serialize &#8211; unserialize ένα object για χρήση του στο session με το να έχεις δηλώσει το object νωρίτερα ή και σωστότερα όπως είπα καλή χρήση του spl_autoload_register . Θα το κάνω μόλις βρω χρόνο και θα δημοσιεύσω εδώ το αποτέλεσμα με σχετικά αρχεία για να κάνει το test και μόνος του όποιος θέλει.)

Απάντηση

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

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

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