PHP bug? Or no?

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

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

Απάντηση
AlexanderTheGr
Δημοσιεύσεις: 153
Εγγραφή: 11 Ιούλ 2003 04:22
Επικοινωνία:

PHP bug? Or no?

Δημοσίευση από AlexanderTheGr » 20 Οκτ 2008 11:44

Καλήμερα σας

Θα ήθελα λίγο τα φώτα σας

Αναπτύσω ένα νέο online κατάστημα για λογαραμό τις εταιρίας μου Έχω ένα μικρό πρόβλημα.

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

class orders {
.
.
.
    function shipping_price() {
    .....
    }
    function saturday_deliv_price() {
    .....
    }
    function count_basket_total_price_items() {
    .....
    }

	function count_total_basket_price() {
		$shipping_price = $this->shipping_price();
		$saturday_deliv_price = $this->saturday_deliv_price();
		$count_basket_total_price_items = $this->count_basket_total_price_items();
		return $shipping_price+$saturday_deliv_price+$count_basket_total_price_items;
	}
.
.
.
}

Στην συνέχεια καλώ την count_total_basket_price() μέσα απο μια άλλη class

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

class template {
.
.
.
.

	function top_header_my_basket() {
		echo "Tιμή:".orders::count_total_basket_price()."€";
	}
.
.
.
.
	
}

Και λαμβάνω το έξης μηνυμα σφάλματος

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

Fatal error: Call to undefined method template::shipping_price() in ....../orders.class.php on line 80
Με λίγα λόγια φαίνετε να καλείτε η shipping_price() μέσα απο την κλάση template και όχι απο την κλάση orders όπως θα έπρεπε.

Καμία ιδέα?

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

PHP bug? Or no?

Δημοσίευση από cpulse » 20 Οκτ 2008 15:36

Πρέπει να χρησιμοποιείς όλα τα functions είτε σαν static είτε τα δυναμικά.
Αν θες να καλείς τα functions σαν static τότε μην χρησιμοποιείς το $this.

Θα σου πω παραδείγματα και μπορείς μετά να τα μεταφέρεις στη δική σου εφαρμογή..

Παράδειγμα static

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

class A {
    function f1() {
        return 1;
    }
    function f2() {
        return 2;
    }
    function fsum() {
        return A::f1() + A::f2();
    }
}

class B {
    function b() {
        echo A::fsum();
    }
}

Δυναμικό παράδειγμα με instances

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

class A {
    function f1() {
        return 1;
    }
    function f2() {
        return 2;
    }
    function fsum() {
        return $this->f1() + $this->f2();
    }
}

class B {
    function b() {
        $a = new A();
        echo $a->fsum();
    }
}
Αν θες να κάνεις μίξη.. μπορείς, αλλά με τρόπο

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

class A {
    function f1() {
        return 1;
    }
    function f2() {
        return 2;
    }
    function fsum() {
        static $instance = null;

        if ($instance === null)
            $instance = new A();

        return $instance->f1() + $instance->f2();
    }
}

class B {
    function b() {
        echo A::fsum();
    }
}

AlexanderTheGr
Δημοσιεύσεις: 153
Εγγραφή: 11 Ιούλ 2003 04:22
Επικοινωνία:

PHP bug? Or no?

Δημοσίευση από AlexanderTheGr » 21 Οκτ 2008 12:05

Βρήκα λύση στο πρόβλημα τελικά

Αν και μια λύση ήταν αυτην που προτείενεις η πιο απλή λύση ήταν η δεύετρη class να οριστεί ώς επεκταση της πρώτης

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

class A {
    function f1() {
        return 1;
    }
    function f2() {
        return 2;
    }
    function fsum() {
        return $this->f1() + $this->f2();
    }
}

class B extends A {
    function b() {
        echo A::fsum();
    }
} 

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

PHP bug? Or no?

Δημοσίευση από cpulse » 21 Οκτ 2008 13:15

Η διαφορά είναι που έχει σημασία εδώ. Όταν φτιάχνουμε instances το σύστημα αναθέτει ένα μέρος της μνήμης για το instance. Όταν καλούμε τις μεθόδους στατικά δεν υπάρχει μνήμη για το object, μόνο για το function που καλείται.

Με τον τρόπο που χρησιμοποιήσες, με το extend, ουσιαστικά χρησιμοποιείς το τρόπο με το instance. Αν δεν φτιάξεις instance για το class B πάλι δεν θα λειτουργήσει το $this. Άρα σε αυτή την περίπτωση δεν χρειάζεται καθόλου η στατική κλήση.

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

class A {
    function f1() {
        return 1;
    }
    function f2() {
        return 2;
    }
    function fsum() {
        return $this->f1() + $this->f2();
    }
}

class B extends A {
    function b() {
        echo $this->fsum();
    }
} 

Απάντηση

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

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

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