Κοινή μεταβλητή μέσα και έξω από κλάσεις.

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

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

Απάντηση
Άβαταρ μέλους
nknet
Δημοσιεύσεις: 97
Εγγραφή: 23 Οκτ 2003 07:54

Κοινή μεταβλητή μέσα και έξω από κλάσεις.

Δημοσίευση από nknet » 27 Δεκ 2008 12:27

Καλησπέρα και Χρόνια πολλά

έχω μια μεταβλητή μέσα σε μια κλάση που θέλω να την χρησιμοποιήσω σε όλο το πρόγραμμα.
Και συνέχεια την ξανακαλώ.

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

class clA() {
	function funA(){
		global metabliti;
	}
	function funb(){
		global metabliti;
	}
}
class clB() {
	function funA(){
		global metabliti;
	}
}
echo metabliti;
Γράφω συνέχεια το global metabliti; πως μπορώ να το αποφύγω?

Ευχαριστώ εκ τον προτέρων.

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

Κοινή μεταβλητή μέσα και έξω από κλάσεις.

Δημοσίευση από cherouvim » 27 Δεκ 2008 13:34

Δε ξέρω αν γίνεται να το αποφύγεις, αλλά έτσι αρχίζεις να καταλαβαίνεις οτι τα globals δεν είναι καλό πράγμα στον προγραμματισμό.

Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

Κοινή μεταβλητή μέσα και έξω από κλάσεις.

Δημοσίευση από cpulse » 27 Δεκ 2008 13:45

Αν είναι κάτι που δεν χρειάζεται να αλλάζει κάντην constant με την define()

Άβαταρ μέλους
nknet
Δημοσιεύσεις: 97
Εγγραφή: 23 Οκτ 2003 07:54

Κοινή μεταβλητή μέσα και έξω από κλάσεις.

Δημοσίευση από nknet » 27 Δεκ 2008 16:40

Δυστυχώς δεν μπορώ να την κάνω constant
Γιατί τα globals δεν είναι καλά (να μην τα χρησιμοποιώ)?

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

Κοινή μεταβλητή μέσα και έξω από κλάσεις.

Δημοσίευση από cherouvim » 27 Δεκ 2008 17:48

http://en.wikipedia.org/wiki/Global_variable
They are usually considered bad practice precisely because of their nonlocality: a global variable can potentially be modified from anywhere, (unless they reside in protected memory) and any part of the program may depend on it. A global variable therefore has an unlimited potential for creating mutual dependencies, and adding mutual dependencies increases complexity.

Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

Κοινή μεταβλητή μέσα και έξω από κλάσεις.

Δημοσίευση από cpulse » 28 Δεκ 2008 15:41

Κι εγώ το ίδιο πιστεύω με τον cherouvim, οτι πρέπει να αποφεύγεις τα global variables όσο μπορείς, εκτώς κι αν ξέρεις πολύ καλά τι πας να κάνεις και δεν υπάρχει περίπτωση να μπλεχτεί το πρόγραμμα σου.

Πάντως μια ακόμα λύση είναι να καλείς την superglobal μεταβλητή $GLOBALS.

Δηλαδή αντί για

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

global $var;
$var = 'abc';
το γράφεις

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

$GLOBALS['var'] = 'abc';

Άβαταρ μέλους
nknet
Δημοσιεύσεις: 97
Εγγραφή: 23 Οκτ 2003 07:54

Κοινή μεταβλητή μέσα και έξω από κλάσεις.

Δημοσίευση από nknet » 29 Δεκ 2008 08:51

Για να γίνω πιο ακριβής
κάνω σύνδεση με τη βάση με την εντολή

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

$mysqli = new mysqli("localhost", "plapla", "plapla", "plapla");
και σε μια κλάση για να μπορέσω να χρησιμοποιήσω την εντολή

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

$result = $mysqli->query($query);
πρέπει μέσα στην κλάση να βάλλω και το

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

global $mysqli ;
τι είναι πιο σωστό να χρησιμοποιώ

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

global $mysqli ;
$result = $mysqli->query($query);
ή

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

$result = $GLOBALS['mysqli']->query($query);
το λέω γιατί στην μεταβλητή θα έχω την σύνδεση της βάσης
Θα έχω πρόβλημα με την ασφάλεια?

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

Κοινή μεταβλητή μέσα και έξω από κλάσεις.

Δημοσίευση από cherouvim » 29 Δεκ 2008 09:51

Κανένα από τα δύο. Για αρχή φτιάξε μία κλάση που θα είναι υπεύθυνη για όλο το data access. Ότι χρειάζεσαι από τη βάση θα το ζητάς από αυτή τη κλάση. Για τα περισσότερα μονολιθικά PHP προγράμματα αυτό είναι αρκετό.

ksamole
Δημοσιεύσεις: 92
Εγγραφή: 08 Οκτ 2006 04:43

Κοινή μεταβλητή μέσα και έξω από κλάσεις.

Δημοσίευση από ksamole » 29 Δεκ 2008 10:33

μπορεις να κανεις και το singleton pattern με pdo αντι msqli καλυτερα

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

class DB {	
		
    /*** Declare instance ***/
    private static $instance = null;
    /**
     *
     * the constructor is set to private so
     * so nobody can create a new instance using new
     *
     */
    private function __construct() {
        /*** maybe set the db name here later ***/
    }

    /**
     *
     * Return DB instance or create intitial connection
     *
     * @return object (PDO)
     *
     * @access public
     *
     */
    public static function getInstance() {
        if (!self::$instance) {
        	self::$instance = new PDO("mysql:host=".db_hostname.";dbname=".db_name, db_username,db_password,array(PDO::ATTR_PERSISTENT => true));
            self::$instance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        	$stmt = self::$instance->prepare("SET CHARACTER SET 'utf8'");
        	$stmt->execute();
        }
        return self::$instance;
    }

    /**
     *
     * Like the constructor, we make __clone private
     * so nobody can clone the instance
     *
     */
    private function __clone(){
    }

}
http://www.phpro.org/tutorials/Introduc ... P-PDO.html

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

Κοινή μεταβλητή μέσα και έξω από κλάσεις.

Δημοσίευση από cherouvim » 29 Δεκ 2008 10:35

Έχε υπόψη οτι και το Signleton ουσιαστικά ένα global είναι.

Πάντως είναι εντάξει για αυτή τη δουλειά.

Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

Κοινή μεταβλητή μέσα και έξω από κλάσεις.

Δημοσίευση από cpulse » 29 Δεκ 2008 10:39

Και τα δύο που λες θα λειτουργήσουν μια χαρά.

Η δικιά μου γνώμη είναι οτι αν το πρόγραμμα σου είναι μικρό ή μεσαίο σε έκταση κώδικα μείνε με αυτό που λες. Το να γράφεις δύο γραμμές αντι για μια, το μόνο κακό που γίνεται είναι οτι γράφεις περισσότερο κώδικα. Δεν έχει επιπτώσεις στην ταχύτητα του προγράμματος σου.

Αν φτιάχνεις κάτι πολύ μεγάλο ή αν φτιάχνεις κάτι που θα το χρησιμοποιείς γενικότερα σαν framework τότε σκέψου να φτιάξεις ένα wrapper class όπως λέει κι ο Γιάννης.

Μια ιδέα για ένα τέτοιο wrapper που θα σου επέτρεπε να γράφεις τα queries σε μια γραμμή είναι αυτό:

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

class MyDB {
    var $db;

    function __construct() {
        $this->db = new mysqli("localhost", "plapla", "plapla", "plapla");
    }

    function &getInstance() {
        static $inst;
        if ($inst === null)
            $inst = new MyDB();

        return $inst;
    }

    function query($sql) {
        $inst =& MyDB::getInstance();
        $inst->db->query($sql);
    }

}

// απο οποιοδήποτε σημείο του κώδικα τώρα γράφεις 
$result = MyDB::query($query);
Και κάτι άσχετο.. επειδή βλέπω οτι έχεις όρεξη να ξεφύγεις από τις γνωστές βιβλιοθήκες της MySQL, δες και τα PDO functions. Λένε οτι είναι ακόμα πιο γρήγορα από όλες τις άλλες βιβλιοθήκες και είναι και ανεξάρτητες από την MySQL. Μπορείς δηλαδή στο μέλλον ακόμα και να αλλάξεις βάση χωρίς να χρειαστούν αλλαγές στον κώδικα.

Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

Κοινή μεταβλητή μέσα και έξω από κλάσεις.

Δημοσίευση από cpulse » 29 Δεκ 2008 10:41

Τόσο concurrent είναι αυτό το forum πια;; :)

ksamole
Δημοσιεύσεις: 92
Εγγραφή: 08 Οκτ 2006 04:43

Κοινή μεταβλητή μέσα και έξω από κλάσεις.

Δημοσίευση από ksamole » 29 Δεκ 2008 11:11

Αν καταλαβα καλα ο cherouvim ειπε να ξεχωρισει το μοντελο με τα data στο προγραμμα

να εχει μια class που να κανει fetch τα data και οταν θελει να τα δειξει να τα ζηταει απο αυτη
την class και να μην κανει inline queries και να περνει τα data ετσι θα κανει και αποτελεσματικο caching στα data...

Σωστα καταλαβα ?

Παντος καλυτερα να πας με pdo αντι mysqli που κανει σχεδον οτι και το mysqli αλλα για ολες
τις βασεις

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

Κοινή μεταβλητή μέσα και έξω από κλάσεις.

Δημοσίευση από cherouvim » 29 Δεκ 2008 11:16

Ναι.
Το caching είναι άλλη υπόθεση, αλλά θα μπορούσε να ζήσει μέσα σε αυτή τη κλάση πολύ ωραία.

Δες και αυτό: http://en.wikipedia.org/wiki/Data_Access_Object

Άβαταρ μέλους
nknet
Δημοσιεύσεις: 97
Εγγραφή: 23 Οκτ 2003 07:54

Κοινή μεταβλητή μέσα και έξω από κλάσεις.

Δημοσίευση από nknet » 30 Δεκ 2008 09:11

Οκ σας ευχαριστώ όλους
και θα ψάξω και τα PDO functions

Απάντηση

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

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

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