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

PHP sprintf VS μεταβλητών «ενωμένες» με τελεία (.)


macabre_sunsets

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

Δημοσ.

Το echo sprintf('test %s', 2) και το echo 'test '.2 παράγουν το ίδιο αποτέλεσμα.

Υπάρχει κάποια επιβάρυνση στον server κατά της χρήση της sprintf; Ή απλά για λόγους ευκολίας χρησιμοποιείται περισσότερο ο δεύτερος τρόπος;

Δημοσ.

Το echo sprintf('test %s', 2) και το echo 'test '.2 παράγουν το ίδιο αποτέλεσμα.

Υπάρχει κάποια επιβάρυνση στον server κατά της χρήση της sprintf; Ή απλά για λόγους ευκολίας χρησιμοποιείται περισσότερο ο δεύτερος τρόπος;

 

...και βέβαια. Η sprintf κάνει και "φορμάρισμα" εξόδου καθώς και κάποιους ελέγχους. Εξού και το f στο τέλος της συνάρτησης. Επειδή η PHP είναι γραμμένη σε C οι προγραμματιστές της είναι επηρεασμένοι από την τεχνοτροπία της C και πολλές φορές αυτό φένεται και στην PHP όπως εδώ στην περιπτωσή σου.

Βλέπεις στην C ότι function έχει 'f' στο τέλος σημαίνει κατά κανόνα ότι κάνει και φορμάρισμα.

 

Αυτά, ελπίζω να σε βοήθησα. :)

Δημοσ.

Ευχαριστώ για την απάντηση. Κάτι τέτοιο φοβόμουν και εγώ. Απλά μου είναι πιο βολικό να χρησιμοποιώ την sprintf για να μην μπερδεύομαι με τα «αυτάκια».

Δημοσ.

Κακώς φοβάσαι τα «αυτάκια». Παίζει να είναι ο πιο εύκολος και straight-forward τρόπος που υπάρχει για να ενώνεις strings, ανεξαρτήτως γλώσσας. Απλά πράγματα: ένα string ορίζεται μέσα σε μονά εισαγωγικά (τα «αυτάκια» που λες). Ενώνεις πολλά strings, όταν ανάμεσα σε αυτά βάλεις μια τελεία. Πόσο πιο απλό;

 

:D

 

>$foo = 'fo'.'foo'.'fooo'.'foooo';

Δημοσ.

Κακώς φοβάσαι τα «αυτάκια». Παίζει να είναι ο πιο εύκολος και straight-forward τρόπος που υπάρχει για να ενώνεις strings, ανεξαρτήτως γλώσσας. Απλά πράγματα: ένα string ορίζεται μέσα σε μονά εισαγωγικά (τα «αυτάκια» που λες). Ενώνεις πολλά strings, όταν ανάμεσα σε αυτά βάλεις μια τελεία. Πόσο πιο απλό;

 

:D

 

>$foo = 'fo'.'foo'.'fooo'.'foooo';

 

Προφανώς ο φίλος το λέει για περιπτώσεις που θέλει να περνάει μεταβλητές και παραμέτρους ή αυτάκια μέσα σε αυτάκια και θέλει να έχει και ' και " οπότε πρέπει να πεδέυεται με τα escaping...

E, ΟΚ λογικό μου ακούγεται να τα "φοβάται" λίγο!

Δημοσ.

Προφανώς ο φίλος το λέει για περιπτώσεις που θέλει να περνάει μεταβλητές και παραμέτρους ή αυτάκια μέσα σε αυτάκια και θέλει να έχει και ' και " οπότε πρέπει να πεδέυεται με τα escaping...

E, ΟΚ λογικό μου ακούγεται να τα "φοβάται" λίγο!

Ακριβώς αυτό! Και μετά άντε να βρεις πού θέλει \" ή \' ή που έχεις ξεχάσει ένα ' ή μήπως ";

 

edit:

Μιας και άνοιξα το thread, μια ακόμα απορία. Έχει διαφορά η τελεία με το κόμα; Επειδή έχω δει να χρησιμοποιείται και το κομα για «ένωση» δεδομένων.

Δημοσ.

Για τέτοιες περιπτώσεις θα ήταν πολύ πιο λογικό να χρησιμοποιήσει double quotes, τα οποία κάνουν parsing των μεταβλητών που εμπεριέχονται στο string. Π.χ.:

 

>$foo = 'bar';

$bar = "foo $foo"; // το $bar θα γίνει 'foo bar'

Δημοσ.

Για τέτοιες περιπτώσεις θα ήταν πολύ πιο λογικό να χρησιμοποιήσει double quotes, τα οποία κάνουν parsing των μεταβλητών που εμπεριέχονται στο string. Π.χ.:

 

>$foo = 'bar';

$bar = "foo $foo"; // το $bar θα γίνει 'foo bar'

 

Haldol πολύ όμορφα τα απλοποιείς όλα αλλά στην περίπτωση που έχεις ας πούμε SQL και θές να υπάρχει interchange αυτών πώς αλλιώς θα το κάνεις?

 

Παράδειγμα 1:

>

$user = "ICE's cube";

$sql_com = "SELECT `user_id` FROM {ANY_TABLE}
           WHERE (`username` = '" . $user . "' OR
                  `email` = '" . $_GET['email'] . "')";

 

Εδώ θα σκάσει το SQL...και καλά αυτό είναι ένα άστοχο παράδειγμα γιατί το πιο μεγάλο πρόβλημα θα το έχεις εάν κάνεις echo HTML.

 

Παράδειγμα 2:

>

$link = "http://www.insomnia.gr/";
$label = "Hack n' Slash";

echo '<a href="$link" target="_blank">' . $label . '<a/>';

 

Εδώ θα σκάσει το echo γιατί έχεις ένα ' στο $label!

 

macabre_sunsets, όχι το κόμα δεν έχει αυτή την ιδιότητα κάτι άλλο θα είδες μάλλον...

Δημοσ.

Παράδειγμα 2:

>

$link = "http://www.insomnia.gr/";
$label = "Hack n' Slash";

echo '<a href="$link" target="_blank">' . $label . '<a/>';

 

Εδώ θα σκάσει το echo γιατί έχεις ένα ' στο $label!

 

Το παράδειγμα 2 δεν θα δουλέψει διότι το echo είναι με ' και όχι με ". Αυτό που θα βγάλει το echo είναι

><a href="$link" target="_blank">Hack n Slash<a/>

 

 

Για να παίξει αυτό που πρότεινε ο Haldol πρέπει το echo να είναι με ". 

Δηλαδή:

>echo "<a href='$link' target='_blank'>" . $label . "<a/>";
ή
echo "<a href=\"$link\" target=\"_blank\">" . $label . "<a/>";

 

 

Σε καμία περίπτωση δεν έχει σχέση με τη τιμή της μεταβλητής $label (αν έχει ή όχι το χαρακτήρα '). Εκτός κ αν με το παράδειγμα αυτό εννοείς κάτι άλλο... 

Δημοσ.

Το παράδειγμα 2 δεν θα δουλέψει διότι το echo είναι με ' και όχι με ". Αυτό που θα βγάλει το echo είναι

><a href="$link" target="_blank">Hack n Slash<a/>

 

 

Για να παίξει αυτό που πρότεινε ο Haldol πρέπει το echo να είναι με ". 

Δηλαδή:

>echo "<a href='$link' target='_blank'>" . $label . "<a/>";
ή
echo "<a href=\"$link\" target=\"_blank\">" . $label . "<a/>";

 

 

Σε καμία περίπτωση δεν έχει σχέση με τη τιμή της μεταβλητής $label (αν έχει ή όχι το χαρακτήρα '). Εκτός κ αν με το παράδειγμα αυτό εννοείς κάτι άλλο... 

 

Αγαπητέ _tasos δεν μπορείς να έχεις τη δομή echo "<a href='$link' target='_blank'>" . $label . "<a/>"; γιατί πολύ απλά αυτό δε σου παράγει ένα valid HTML element γιατί πολύ απλά δεν υπάρχει πρότυπο της HTML που να πέρνει μονό quote για ορίσματα.

 

Δεν έχω να προσθέσω κάτι άλλο.

Δημοσ.

Αγαπητέ _tasos δεν μπορείς να έχεις τη δομή echo "<a href='$link' target='_blank'>" . $label . "<a/>"; γιατί πολύ απλά αυτό δε σου παράγει ένα valid HTML element γιατί πολύ απλά δεν υπάρχει πρότυπο της HTML που να πέρνει μονό quote για ορίσματα.

 

Δεν έχω να προσθέσω κάτι άλλο.

 

Ο παρακάτω κώδικας κάνει validate σαν XHTML 1.0 Transitional. Αν θέλεις δοκίμασε το στο http://validator.w3.org/.  ;)

 

><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

<head>
<title>Test</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"  />
</head>
<body>
<p>
 <a href='default.htm'>Hack n' Slash</a>
</p>
</body>
 </html>

Δημοσ.
macabre_sunsets, όχι το κόμα δεν έχει αυτή την ιδιότητα κάτι άλλο θα είδες μάλλον...

Το θυμάμαι επειδή μου είχε κάνει εντύπωση. Παραθέτω ένα μικρό κομμάτι κώδικα, από το SMF:

>echo '
	<div>
		<div>
			<textarea class="editor" name="', $editor_id, '" id="', $editor_id, '" rows="', $editor_context['rows'], '" cols="', $editor_context['columns'], '" onselect="storeCaret(this);" onclick="storeCaret(this);" onkeyup="storeCaret(this);" onchange="storeCaret(this);" tabindex="', $context['tabindex']++, '" style="', $context['browser']['is_ie8'] ? 'max-width: ' . $editor_context['width'] . '; min-width: ' . $editor_context['width'] : 'width: ' . $editor_context['width'], '; height: ', $editor_context['height'], ';', isset($context['post_error']['no_message']) || isset($context['post_error']['long_message']) ? 'border: 1px solid red;' : '', '">', $editor_context['value'], '</textarea>
		</div>[...]

Γιατί χρησιμοποιεί κόμα εδώ;

Δημοσ.

http://www.php.net/manual/en/function.echo.php

 

>
void echo ( string $arg1 [, string $... ] )

 

Όπως βλέπεις, δέχεται πολλαπλά arguments χωρισμένα με κόμμα. Όταν εσύ κάνεις concatenation, αποτιμάται πρώτα το αποτέλεσμα όλων αυτών των συνενώσεων και τελικά εκτελείται η echo με ένα μοναδικό string ως όρισμα.

 

Επίσης, ως language construct (και όχι function) που είναι, λογικά πρέπει να είναι και πιο γρήγορη από print και Σία, αν κάτι τέτοιο σε ενδιαφέρει.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...