2010-11-24 26 views
34

En PHP, le point string operator (.) Est utilisé pour concaténer les chaînes. Par exemple:Pourquoi l'opérateur de concaténation de chaîne php est-il un point (.)?

$msg = "Hello there, " . $yourName; 

L'opérateur point semble toujours confondre les gens (moi y compris) la première fois qu'ils voient, d'autant plus que lorsque vous l'utilisez pour concaténer 2 cordes, l'opération ne jette pas une erreur mais juste " silencieusement "échoue. C'est aussi une erreur courante lors de la commutation entre PHP et d'autres langages tels que JavaScript, Python, etc. qui n'utilisent pas cet opérateur. Ma question est, pourquoi la langue utilise l'opérateur point (.) Au lieu d'un opérateur plus largement accepté comme plus (+)? Y a-t-il des raisons historiques pour lesquelles vous pouvez indiquer pourquoi cet opérateur a été sélectionné? Est-ce juste parce que le point peut convertir d'autres types de variables en chaînes? Par exemple:

echo 1 . 2;    //prints the string "12" 

Merci!

+17

L'utilisation d'un + ne serait pas particulièrement pratique dans un langage faiblement typé: devrait écho 1 + 2; donner 12 ou 3? –

+0

"Est-ce juste parce que le point peut convertir d'autres types de variables en chaînes de caractères?" Comme tout ce qui attend une chaîne de type primitive cast à des chaînes: Oui, c'est la raison;) – KingCrunch

+0

J'aimerais l'opérateur '+' pour la concaténation de chaînes en PHP, l'opérateur '. 'Est seulement confus et c'est l'une des rares choses Je déteste le plus à propos de PHP. –

Répondre

27

Je pense que c'est une bonne idée d'avoir un opérateur différent, car le point et le plus font des choses complètement différentes.

Que signifie réellement "a string" + "another string";, d'un point de vue de langue non spécifique?

Est-ce que cela signifie

  • Ajoutez la valeur numérique des deux chaînes, ou,
  • concaténer les deux chaînes

Vous assumeraient que ça est le deuxième, mais un signe plus est utilisé pour l'addition numérique dans tous les cas sauf les cordes. Pourquoi?

En outre, d'un point de vue faiblement typé (qui est PHP), un script php

$myvar = 1; 
$myvar2 = 2; 

// would we expect a concatenation or addition? 
$concat = $myvar + $myvar2; 

La notation de points indique donc qu'il est clairement utilisé pour la concaténation.

Ce n'est pas que cela soit déroutant, c'est que ce n'est pas intuitif parce que toutes les autres langues le font d'une manière différente. Et, est-ce une bonne raison de suivre la tendance? Faire les choses telles qu'elles sont toujours faites n'est pas toujours la bonne.

+3

J'apprécie vos raisons logiques, mais je ne suis pas du tout d'accord. Le point est juste confus et l'une des rares choses que je déteste vraiment à propos de PHP. –

+9

* Pourquoi * est-il "juste déroutant"? Votre commentaire ci-dessus semble n'impliquer rien de plus qu'une préférence personnelle pour l'opérateur '+ '(que je soupçonne provenir de votre expérience avec d'autres langues qui l'utilisent?). – traq

+5

Je pense que c'est au moins un petit peu confus que «1. 2' n'est pas égal à "1,2". Et quelqu'un avec un fond de mathématiques pourrait penser '$ x. $ y' signifiait '$ x' multiplié par' $ y'. (Mais évidemment, quiconque commence à coder dans une nouvelle langue devrait apprendre les opérateurs de base pour cette langue.) – nnnnnn

5

Il n'est pas possible d'utiliser + comme opérateur de concaténation en PHP, à cause de l'équivalence entre les chaînes de chiffres et les nombres. Vous auriez deux opérateurs utilisant le même symbole, et le résultat de "3" + 3 devrait être indéfini. Maintenant, "3" + 3 est 6, et "3" . 3 est "33".

+4

_ "" 3 "+ 3 devrait être indéfini." _ - Il n'aurait pas à être indéfini, il pourrait simplement se transformer en une chaîne comme beaucoup d'autres langues parviennent à le faire sans démêler le tissu même du temps et de l'espace. – nnnnnn

8

Le signe plus n'est pas aussi "largement accepté" que vous imaginez pour la concaténation de chaînes. Il y a un lot de langages qui ne l'utilisent pas, y compris Perl et C, et puisque ce sont là les racines de PHP, il est logique que PHP le suive. Beaucoup de langues n'ont même pas d'opérateur pour cela; vous devez utiliser une fonction concat().

PHP est faiblement typé et fera une conversion de type implicite lorsqu'il verra le signe plus ou un point. Cela signifie que si vous faites $x = "45 inches" + "20 inches";, PHP va définir $x à 65. Si vous utilisez l'opérateur de concaténation de points, le résultat sera clairement différent.La même chose s'applique si vous avez $y = 5 . 10;. Cela vous donnera 510, mais changez-le en signe plus et vous obtenez un résultat complètement différent. En outre, en pensant logiquement, le contraire d'un plus est un moins. Mais cela ne correspond pas si facilement à la concaténation. (J'ai vu une langue qui l'a essayé, mais cela n'a vraiment pas de sens)

Votre préférence pour le signe plus comme concaténateur est purement une résistance à changer lors de l'apprentissage d'une nouvelle langue chose - je connais quelques personnes qui détestaient initialement Python parce qu'il manque d'accolades!)

Comme quelqu'un qui a programmé pendant longtemps en utilisant beaucoup de langues, je peux vous dire que je préfère de loin avoir un opérateur de concaténation univoque . Utiliser le même opérateur pour l'addition et la concaténation dans une langue faiblement typée demande des problèmes; en fait, je dirais que c'est l'un des plus gros défauts de Javascript (et cela vient de quelqu'un qui en général est fan de Javascript). Python est stronly-typed, ce qui signifie qu'il peut s'en tirer en utilisant le signe plus comme opérateur d'addition et de concaténation car il vous oblige à travailler avec le même type; vous ne pouvez pas ajouter un entier à une chaîne en Python; Si vous en avez besoin, vous devez explicitement lancer vos types, donc il n'y a pas d'ambiguïté, du moins pas pour le compilateur. Cependant, il existe toujours une ambiguïté pour le lecteur - il n'est pas toujours évident de lire ce que l'on entend par un signe plus donné dans le code. C'est plus facile en Python de s'en sortir, mais personnellement, je préférerais avoir un opérateur sans ambiguïté. Mais c'est juste une préférence personnelle; Si je travaille avec Python, Javascript ou Visual Basic, je dois travailler selon leurs règles.

+7

Le langage 'C' n'utilise pas l'opérateur' + 'car il n'a pas d'opérateur de concaténation de chaîne du tout!Vous pouvez surcharger les opérateurs de classe uniquement en C++ et je me souviens encore que l'une des premières choses que j'ai faites en apprenant C++ était une classe 'MyString' avec l'opérateur' + 'utilisé pour concaténer les chaînes. C'était cool! –