Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Φιλοσοφική συζήτηση.

 

Αν βάλω if (dragon) ...

 

Αν το dragon έχει τιμή θα επιστρέψει true

Αν το dragon δεν έχει οριστεί θα επιστρέψει false

 

Την έχω βρει τη λύση αλλά θέλω να κάνουμε αυτή τη συζήτηση

Δημοσ.

Υποθέτω πως αναφέρεσαι στην isset() της PHP.

 

Κατ' αρχήν, αν η μεταβλητή δεν υπάρχει και προσπαθήσεις να τη χρησιμοποιήσεις, θα πάρεις μαζί και ένα notice (undefined index/variable/property).

 

Ακόμα και αν δε σε ενδιαφέρει αυτό (αν και κατά τη γνώμη μου θα πρέπει να σε ενδιαφέρει), δε θα ξέρεις στην πραγματικότητα γιατί το if($var) {} αποτυγχάνει.

 

Μπορεί η μεταβλητή όντως να μην υπάρχει, ή να έχει μία από τις παρακάτω τιμές: null, [], false, 0, '0', '', κλπ.

 

Θεωρώ καλή πρακτική το να ξέρουμε τι έχει συμβεί πραγματικά με μια μεταβλητή ώστε να δράσουμε αναλόγως. Αν πχ η μεταβλητή δεν υπάρχει (!isset($var)), να αγνοήσουμε κάποια πράγματα, ή να κάνουμε initialise κάτι, αν είναι false ($var === false) να επιστρέψουμε κάποιο error, και αν είναι μηδέν ($var === 0) να ορίσουμε ένα άλλο default νούμερο.

 

Κατ' επέκταση, γι' αυτό και στις περισσότερες των περιπτώσεων είναι προτιμότερο (πάντα κατά τη γνώμη μου) να κάνουμε identity comparison (===) και όχι quality comparison (==).

  • Like 1
Δημοσ.

Δεν υπάρχει περιθώριο για συζήτηση, τα λέει όλα στο manual.

  • Αν δεν έχει τιμή το dragon τότε με if θα πάρεις E_NOTICE (αυτό και μόνο είναι αρκετό για να φάει άκυρο το if, αν και στην πράξη το να γράψεις κώδικα έτσι που μην είναι σίγουρο αν έχει τιμή το dragon είναι ακόμα χειρότερο οπότε εκεί πρέπει να διορθωθεί το πρόβλημα).
  • Αν το dragon έχει falsy non-null τιμή προφανώς το απλό boolean conversion θα επιστρέψει false ενώ η isset true.

Η isset γενικά είναι χρήσιμη όταν ψαχουλεύεις μέσα σε κάποιο data structure που έρχεται "απ έξω", κλασική περίπτωση τα superglobals.

  • Like 4
  • 2 εβδομάδες αργότερα...
Δημοσ.

...και πιο απλά με την isset ελέγχεις αν υφίσταται η μεταβλητή, ενώ με την if ($dragon) κατά ποσό περιέχει κάτι.

Δημοσ.

Χρησιμοποιούσα την if($dragon) σε windows server και την έβγαζε σωστή , σε linux μηχάνημα την βγάζει notice δηλαδή βγάζει error σε μεταβλητές που δεν είναι σεταρισμένες μέσα στην if()

Δημοσ.

Το αν τα E_NOTICE "δημιουργούνται" όταν κάνεις κάτι λάθος είναι ρυθμίσιμο από το configuration της php.

 

To αν εμφανίζονται τα μηνύματα εφόσον έχουν δημιουργηθεί είναι επίσης ρυθμίσιμο.

 

Σε κάθε περίπτωση μπορεί κανείς να τα ελέγξει αυτά και από κώδικα.

 

Είναι λάθος να γράφει κανείς κώδικα που μπορεί, υπό οποιεσδήποτε συνθήκες, να δώσει E_NOTICE ή οτιδήποτε άλλο error. Σε επίπεδο κάνω την πλάκα μου μπορεί κανείς να το αγνοήσει χωρίς συνέπειες, αλλά αυτό δεν το κάνει λιγότερο λάθος.


...και πιο απλά με την isset ελέγχεις αν υφίσταται η μεταβλητή, ενώ με την if ($dragon) κατά ποσό περιέχει κάτι.

 

Συγγνώμη αλλά έχεις λάθος και στα δύο μέρη.

$foo = null;
if (isset($foo)) echo "isset"; // δεν τυπώνει παρόλο που "υφίσταται" η μεταβλητή

$bar = 0; // ή "0", ή "", ή false, ή [], ή κανα δυο πράγματα ακόμα
if ($bar) echo "success"; // δεν τυπώνει παρόλο που "περιέχει κάτι"
  • Like 2
Δημοσ.

 

Το αν τα E_NOTICE "δημιουργούνται" όταν κάνεις κάτι λάθος είναι ρυθμίσιμο από το configuration της php.

 

To αν εμφανίζονται τα μηνύματα εφόσον έχουν δημιουργηθεί είναι επίσης ρυθμίσιμο.

 

Σε κάθε περίπτωση μπορεί κανείς να τα ελέγξει αυτά και από κώδικα.

 

Είναι λάθος να γράφει κανείς κώδικα που μπορεί, υπό οποιεσδήποτε συνθήκες, να δώσει E_NOTICE ή οτιδήποτε άλλο error. Σε επίπεδο κάνω την πλάκα μου μπορεί κανείς να το αγνοήσει χωρίς συνέπειες, αλλά αυτό δεν το κάνει λιγότερο λάθος.

 

Συγγνώμη αλλά έχεις λάθος και στα δύο μέρη.

$foo = null;
if (isset($foo)) echo "isset"; // δεν τυπώνει παρόλο που "υφίσταται" η μεταβλητή

$bar = 0; // ή "0", ή "", ή false, ή [], ή κανα δυο πράγματα ακόμα
if ($bar) echo "success"; // δεν τυπώνει παρόλο που "περιέχει κάτι"

 

Στην περίπτωση που θέλουμε όμως να τυπώνει κάτι όταν η μεταβλητή απλά περιέχει μία εκ των παραπάνω τιμών, τι κάνουμε;

Δημοσ.

@rafinos Είτε κάνεις έναν έλεγχο για τις συγκεκριμένες τιμές που θες (αν είναι πολλές μπορείς να φτιάξεις ένα function γι' αυτό), ή χρησιμοποιείς την empty αν όλες οι τιμές που σε ενδιαφέρουν περιέχονται στη λίστα των τιμών που αναγνωρίζει (η λίστα υπάρχει στο manual).

Δημοσ.

Στην περίπτωση που θέλουμε όμως να τυπώνει κάτι όταν η μεταβλητή απλά περιέχει μία εκ των παραπάνω τιμών, τι κάνουμε;

 

Η αντίρρησή μου δεν είναι στην τεχνική, αλλά στον ορισμό του "περιέχει κάτι". Πάω με τον ορισμό ότι αν έχεις $foo = false τότε η foo σαφώς "περιέχει κάτι", το boolean false. Η μόνη περίπτωση που θα έλεγα ότι δεν περιέχει κάτι θα ήταν αν έκανες unset($foo). Ακόμα και $foo = null "περιέχει κάτι". Ο ορισμός μου δηλαδή για το αν "περιέχει κάτι" είναι, για να το πω με άλλα λίγο μπακάλικα λόγια, αν η μεταβλητή εμφανίζεται στην έξοδο της get_defined_vars.

 

Αν θέλεις να κάνεις κάτι όταν η μεταβλητή περιέχει μια από τις παραπάνω τότε sure, if (!$foo).

 

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

  • Δεν δίνει E_NOTICE αν δεν υπάρχει η μεταβλητή (επιστρέφει false)
  • Αλλά επίσης επιστρέφει false αν η μεταβλητή έχει falsy τιμή

Θα ήταν πολύ χρήσιμο να μπορούσες να κάνεις μόνο το πρώτο (και να επιστρέφει true σε όλες τις άλλες περιπτώσεις) αλλά εφόσον δε γίνεται στην πράξη είναι άχρηστη. Οπότε μετά πάμε στην isset() η οποία έχει το ίδιο πρόβλημα αλλά σε μικρότερη έκταση (επιστρέφει false αν είναι null), που είναι η καλύτερη διαθέσιμη επιλογή. Δυστυχώς και πάλι έτσι δε μπορείς να διαχωρίσεις ανάμεσα στο "δεν υπάρχει" και το "υπάρχει αλλά είναι null".

Δημοσ.

Συγγνώμη αλλά έχεις λάθος και στα δύο μέρη.

$foo = null;
if (isset($foo)) echo "isset"; // δεν τυπώνει παρόλο που "υφίσταται" η μεταβλητή

$bar = 0; // ή "0", ή "", ή false, ή [], ή κανα δυο πράγματα ακόμα
if ($bar) echo "success"; // δεν τυπώνει παρόλο που "περιέχει κάτι"

@defacer

Σωστά, έχεις δίκιο. Δεν είχα σκεφτεί την περίπτωση να είναι null, όπου σ αυτή την περίπτωση κάνω έλεγχο με την is_null() συνάρτηση.

Δημοσ.

Σωστά, έχεις δίκιο. Δεν είχα σκεφτεί την περίπτωση να είναι null, όπου σ αυτή την περίπτωση κάνω έλεγχο με την is_null() συνάρτηση.

 

Δεν μπορείς (σε εισαγωγικά) γιατί is_null($foo) ή το ισοδύναμο $foo === null θα δώσουν E_NOTICE αν όντως δεν υπάρχει η μεταβλητή. Γενικά δεν υπάρχει στην PHP sane τρόπος να ξεχωρίσεις ανάμεσα σ' αυτά τα δύο (null/δεν υπάρχει καθόλου), εξού και αυτό που είχα πει προς την αρχή ότι είναι λάθος να γράφεις κώδικα του οποίου η συμπεριφορά εξαρτάται από το αν υπάρχει ή όχι μια μεταβλητή.

 

Ή όπως λέει και ο rafinos... wtf php?  :-D

Δημοσ.

OMG... αυτό το link είναι πιο χρήσιμο σαν απάντηση στην ερώτηση "γιατί η PHP είναι μπάζο" παρά για το topic που συζητάμε...  :P  ;)

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...