2010-11-24 15 views
34

En PHP, el punto string operator (.) Se utiliza para concatenar cadenas. Por ejemplo:¿Por qué el operador de concatenación de cadena php es un punto (.)?

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

El operador punto siempre parece confundir a la gente (me incluyo) la primera vez que lo ven, sobre todo porque cuando lo utiliza para concatenar 2 cadenas, la operación no arroja un error, sino simplemente " silenciosamente "falla". También es un error común al cambiar entre PHP y otros lenguajes como JavaScript, Python, etc. que no usan este operador.

Mi pregunta es, ¿por qué el lenguaje utiliza el operador punto (.) En lugar de un operador más ampliamente aceptado como más (+)? ¿Hay alguna razón histórica por la que pueda señalar por qué se seleccionó este operador? ¿Es solo porque el punto puede convertir otros tipos de variables en una cadena? Por ejemplo:

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

Gracias!

+17

El uso de un + no sería particularmente práctico en un lenguaje de tipo suelto: debe hacer eco de 1 + 2; dar 12 o 3? –

+0

"¿Es solo porque el punto puede convertir otros tipos de variables en una cadena?" Como todo, que espera un tipo de primitivo de cadena para cadenas: Sí, esa es la razón;) – KingCrunch

+0

Me encantaría el operador '+' para la concatenación de cadenas en PHP, el operador '.' solo es confuso y es una de las pocas cosas Odio más sobre PHP –

Respuesta

27

Creo que es una buena idea tener un operador diferente, porque dot y plus hacen cosas completamente diferentes.

¿Qué significa realmente "a string" + "another string";, desde un punto de vista del lenguaje no específico?

Qué significa

  • Agregue el valor numérico de las dos cadenas, o,
  • concatenar las dos cadenas

Se podría suponer que es el segundo, pero un signo más es utilizado para la suma numérica en todos los casos excepto cadenas. ¿Por qué?

También, desde un punto libremente mecanografiado de vista (que PHP es), un script php

$myvar = 1; 
$myvar2 = 2; 

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

La notación de punto, por tanto, se especifica que se utiliza claramente para la concatenación.

No es que sea confuso, es que no es intuitivo porque todos los otros lenguajes lo hacen de otra manera. Y, ¿es esta una buena razón para seguir la tendencia? Hacer las cosas de la manera en que siempre se hacen, no siempre es la manera correcta.

+3

Aprecio tus razones lógicas, pero estoy totalmente en desacuerdo. El punto es confuso y una de las pocas cosas que realmente odio sobre PHP. –

+9

* ¿Por qué * es "simplemente confuso"? Su comentario anterior parece implicar nada más que una preferencia personal por el operador '+' (sospecho que proviene de su experiencia con otros idiomas que lo usan). – traq

+5

Creo que es al menos un poco confuso que '1. 2' no es igual a '1.2'. Y alguien con conocimientos de matemáticas podría pensar '$ x. $ y' significa '$ x' multiplicado por' $ y'. (Pero obviamente, cualquiera que esté empezando a codificar en un nuevo idioma debe aprender los operadores básicos para ese idioma). – nnnnnn

5

No es posible utilizar + como operador de concatenación en PHP, debido a la equivalencia entre cadenas de dígitos y números. Tendría dos operadores que usan el mismo símbolo, y el resultado de "3" + 3 tendría que estar indefinido. Ahora, "3" + 3 es 6, y "3" . 3 es "33".

+4

_ "" 3 "+ 3 tendrían que estar indefinidos." _ - No tendría que ser indefinido, podría simplemente enviarse a una cadena como muchos otros lenguajes logran hacer sin desentrañar el mismo tejido de tiempo y espacio. – nnnnnn

8

El signo más no es tan "ampliamente aceptado" como podría imaginarse para concatenar cadenas. Hay un lote de idiomas que no lo usan, incluyendo Perl y C, y dado que estos son los lugares donde se encuentran las raíces de PHP, tiene sentido que PHP haga lo mismo. Muchos idiomas ni siquiera tienen un operador para eso; tendrías que usar una función concat().

PHP está débilmente tipado, y hará una conversión de tipo implícita cuando vea el signo más o un punto. Esto significa que si lo hace $x = "45 inches" + "20 inches";, PHP establecerá $x en 65. Si usa el operador de concatenación de puntos, el resultado será claramente muy diferente.Lo mismo aplica si tiene $y = 5 . 10;. Esto le dará 510, pero cámbielo a un signo más y obtendrá un resultado completamente diferente.

Además, pensando lógicamente, lo contrario de un más es un signo menos. Pero eso no se asigna tan fácilmente a la concatenación. (He visto un idioma que lo probó, pero realmente no tenía mucho sentido)

Su preferencia por el signo más como concatenación es puramente una resistencia al cambio cuando se aprende un nuevo idioma (bastante común Lo sé - ¡Conozco a algunas personas que inicialmente odiaban a Python porque carecía de llaves!)

Como alguien que ha estado programado durante mucho tiempo usando muchos idiomas, puedo decirle que prefiero tener un operador de concatenación inequívoco . Usar el mismo operador para la adición y la concatenación en un lenguaje de tipo suelto es pedir problemas; de hecho, diría que es uno de los defectos más grandes de Javascript (y esto viene de alguien que en general es un fanático de Javascript).

Python tiene caracteres fuertes, lo que significa que puede salirse con la suya usando el signo más como el operador de suma y concatenación porque lo obliga a trabajar con el mismo tipo; no puede agregar un número entero a una cadena en Python; si lo necesita, entonces tiene que emitir explícitamente sus tipos, por lo que no hay ambigüedad, al menos no para el compilador.

Sin embargo, todavía hay ambigüedad para el lector; puede que no sea inmediatamente obvio al leer lo que significaba cualquier signo más en el código. En Python es más fácil resolverlo, pero personalmente preferiría tener un operador inequívoco. Pero eso es solo una preferencia personal; si estoy trabajando con Python, Javascript o Visual Basic, entonces tengo que trabajar según sus reglas.

+7

¡El lenguaje 'C' no utiliza el operador '+' porque no tiene un operador de concatenación de cadenas en absoluto!Puedes sobrecargar a los operadores de clase solo en 'C++' y aún recuerdo que una de las primeras cosas que hice mientras aprendía 'C++' era una clase 'MyString' con el operador' + 'usado para concatenar cadenas. ¡Fue genial! –

Cuestiones relacionadas