Como pode acontecer isso no PHP?

Vendo no http://desciclo.pedia.ws/wiki/PHP esse código do PHP,
não acreditei, mas é verdade.

<?php if (('1 galinha' + '2 pardais') == '3 aves') { echo 'são iguais!!!'; } ?>

Essa instrução é verdadeira. Alguém pode explicar isso?

é “incompreensivel” isso acontecer…

alguém pode até explicar isso… e com certeza vão explicar, mas muito louco!!!

é nisso que dá Linguagens não Tipadas!! hahaha

por isso tonyam use Java sempre, pra que vc não desenvolva uma aplicação e ela acabe confundindo 2 aves + 1 Pessoa = 3 Frangos… kkkkkk

flw!

<?php
		if ("linguagem" + " não " +  "tipada" == "loucura total") {
			echo "mude para o java!";
		}
?>

Isso porque a concatenação em PHP não se dá através do sinal de mais, e sim através do ponto. Usando o sinal de mais, ele considera uma soma. E o valor dessas strings na soma é sempre zero. Logo, aquilo seria o mesmo que escrever:

<?php
if ((0 + 0) == 0) {
echo 'são iguais!!!';
}
?> 

Tanto que a forma correta funciona como esperado:

<?php
	if (('1 galinha'.'2 pardais') == '3 aves') {
		echo 'são iguais!!!';
	}
?>

O código acima não imprime nada.

Melhor que sempre usar Java, use sempre o seu cérebro para entender como funciona a ferramenta antes de usar-la pra valer.

vc sabe de PHP Rubem Azenha???

parece que não!! pq se soubesse um pouco saberia que essa explicação

[quote] 1. <?php
2. if (“linguagem” + " não " + “tipada” == “loucura total”) {
3. echo “mude para o java!”;
4. }
5. ?>

Isso porque a concatenação em PHP não se dá através do sinal de mais, e sim através do ponto. Usando o sinal de mais, ele considera uma soma. E o valor dessas strings na soma é sempre zero. Logo, aquilo seria o mesmo que escrever:

[/quote]

é diferente da que foi perguntada… que no caso é essa: (não que essa não se aplique, é verdade, mas não nesse caso!)

[quote]<?php
if ((‘1 galinha’ + ‘2 pardais’) == ‘3 aves’) {
echo ‘são iguais!!!’;
}
?> [/quote]

o que não se aplica a explicação do colega tonyam… pois se vc colocar números na frente de uma String ele somará sim.

como por exemplo:

‘1 Idiota’ + ‘2 Idiotas’ == ‘4 Idiotas’ ???

NÃO!! o PHP é inteligente… agora se vc fizer:

‘1 Idiota’ + ‘2 Idiotas’ == ‘3 Idiotas’ ???

isso sim é igual, pq ele pega os números da String e soma mesmo! pq??? talvez por não ser tipada!!

mas… enfim… isso se explica pela falta de tipagem mesmo!!

pq em outras linguagens vc não conseguiria somar duas Strings… pq teria que convertê-las…e na conversão:

Não seria um valor inteiro válido!!

no caso do PHP ele soma pelo fato de dentro da String na 1º posição ter um inteiro… ai ele presume que tem que converter pra somar!!

Ruby também não tem tipagem e não acontece essas coisas.

Você mesmo respondeu a questão, e não tem nada a ver com tipagem.

Tem a ver como foi implementada a concatenação de strings no PHP. Se tá errado, é falha da implementação não da tipagem.

[quote=Felagund]Ruby também não tem tipagem e não acontece essas coisas.

Você mesmo respondeu a questão, e não tem nada a ver com tipagem.

Tem a ver como foi implementada a concatenação de strings no PHP. Se tá errado, é falha da implementação não da tipagem.[/quote]

Só uma correção, ruby tem tipagem dinâmica e forte: http://www.rubyfleebie.com/ruby-is-dynamically-and-strongly-typed/

O PHP é tipado sim, só que ele tem tipagem dinâmica, ao contrário de linguagens como Java e C/C++, que possuem tipagem estática. De forma vulgar, uma linguagem com tipagem dinâmica permite que uma variável referencie objetos de várias classes ao longo do tempo. Por exemplo:

elomar = "Elomar" # Isso é uma String elomar = Person.new(:name => "Elomar") # Isso é um objeto da classe Person

No caso acima, a variável local elomar referenciou dois objetos de classes diferentes, o que não seria possível com uma linguagem estaticamente tipada, já que a referida variável teria que ser declarada como pertencente a um tipo específico.

é pq no PHP a concatenação não é com + e sim com .

até ai blz!mas…

ter tipagem dinâmica naum quer dizer muita coisa, pq naum eh uma tipagem que vc controla e sim a linguagem controla e controla do jeito que ela achar interessante… como nesse caso dizer que ‘1 galinha’ + ‘2 pardais’) == ‘3 aves’.

pq em Linguagens tipadas isso não poderia ser feito.

o Ruby eh ou não tipado?? (não considere Tipagem dinâmica como Tipagem (estática) que se fala normalmente… pq todos nós sabemos que mais cedo ou mais tarde ele vai converter a variavel…)!

é pq no PHP a concatenação não é com + e sim com .

até ai blz!mas…

ter tipagem dinâmica naum quer dizer muita coisa, pq naum eh uma tipagem que vc controla e sim a linguagem controla e controla do jeito que ela achar interessante… como nesse caso dizer que ‘1 galinha’ + ‘2 pardais’) == ‘3 aves’.

pq em Linguagens tipadas isso não poderia ser feito.

o Ruby eh ou não tipado?? (não considere Tipagem dinâmica como Tipagem (estática) que se fala normalmente… pq todos nós sabemos que mais cedo ou mais tarde ele vai converter a variavel…)![/quote]
O Ruby é tipado, assim como todas as linguagens de programação que eu conheço, uma vez que possui um sistema de tipos, sendo este dinâmico (uma variável não precisa ter um tipo declarado) e forte (operações como “1” + 1 geram exceções).

Ruby tem tipagem dinamica.

porém vc não pode fazer

pessoa = “X”
pessoa = Pessoa.new

você não define um tipo para pessoa, mas não pode mudar para tipos incompativeis

por exemplo

i = 0
j = “1”

i = j //erro
i = j.to_i //ok

Essa é magica que o PHP não possui.

[quote=Felagund]Ruby tem tipagem dinamica.

porém vc não pode fazer

pessoa = "X"
pessoa = Pessoa.new

você não define um tipo para pessoa, mas não pode mudar para tipos incompativeis

por exemplo

i = 0
j = "1"

i = j //erro
i = j.to_i //ok

Essa é magica que o PHP não possui.[/quote]
Na verdade você pode fazer usando o Ruby tudo isso que você disse que não pode, até porque essa é basicamente a definição de tipagem dinâmica. Ou seja, uma linguagem com tipagem dinâmica não precisa ter um tipo declarado para as suas variáveis, portanto, você pode atribuir a uma variável referências a objetos de diversas classes, que é basicamente o que você disse que não é possível fazer.

Você pode checar isso através do irb, ou observar abaixo a saída dos comandos que você indicou:

irb irb(main):001:0> class Pessoa irb(main):002:1> end => nil irb(main):003:0> pessoa = "X" => "X" irb(main):004:0> pessoa = Pessoa.new => #<Pessoa:0x2c67288> irb(main):005:0> i = 0 => 0 irb(main):006:0> j = "1" => "1" irb(main):007:0> i = j # Não dará erro => "1" irb(main):008:0> i = j.to_i # Não dará erro também, e nesse caso atribuirá 1 ao invés de "1" => 1 irb(main):009:0>

Enfim, não existe tipos inconpatíveis no que diz respeito a atribuir referências à variáveis no Ruby, e nem nas demais linguagens dinâmicas, até porque isso é o que define uma linguagem dinâmica. As incompatibilidades só existem quando você for, por exemplo, somar "1" com 1, o que, no Ruby, gerará uma exceção, mas não por ser uma linguagem dinamicamente tipada, e sim por ser fortemente tipada.

mas… se o Ruby eh fortemente Tipada… o que dizer do Java então???

ALTAMENTE EXTRA FORTEMENTE TIPADA???

o Ruby consegue fazer isso??

[code]j = “1 Me Ajude”
i= 0

j = i[/code]

o PHP consegue… então o conceito de Tipagem dinâmica eh diferente para as duas linguagens!

pq no PHP vc pode fazer uma variavel multável (aliais, td eh mutável!)! ou seja uma hora ela eh uma Pessoa logo depois eh um numero! certo??

[quote=aeciovc]mas… se o Ruby eh fortemente Tipada… o que dizer do Java então???

ALTAMENTE EXTRA FORTEMENTE TIPADA???

o Ruby consegue fazer isso??

[code]j = “1 Me Ajude”
i= 0

j = i[/code]

o PHP consegue… então o conceito de Tipagem dinâmica eh diferente para as duas linguagens!

pq no PHP vc pode fazer uma variavel multável (aliais, td eh mutável!)! ou seja uma hora ela eh uma Pessoa logo depois eh um numero! certo??

[/quote]
Você está confundindo os conceitos. O Ruby é dinamicamente tipado, o que permite que uma variável referencie objetos de várias classes diferentes ao longo do tempo, portanto ele pode sim executar o código que você escreveu acima, assim como o PHP, uma vez que ambas são linguagens dinamente tipadas. Em contrapartida, existem as linguagens estaticamente tipadas, como Java e C/C++, que não permitem fazer isso, uma vez que é necessário declarar um tipo para as variáveis. Ou seja, uma linguagem é dinamicamente tipada, como Ruby e PHP, ou estaticamente tipada, como Java e C/C++.

Além disso, o sistema de tipos de uma linguagem, pode ser classificado também como forte ou fraco, além da classificação como dinâmico ou estático explicada acima. Uma linguagem fortemente tipada impede que sejam realizadas operações como “1” + 1, pois os dois valores são de tipos diferentes, no caso uma String e um número inteiro.

Concluindo, uma linguagem pode ter tipagem dinâmica ou estática, e tipagem forte ou fraca, sendo as duas classificações ompletamente independentes. Um exemplo dessa independência é o fato do Ruby e do Java serem ambos fortemente tipados, embora o Ruby tenha tipagem dinâmica e o Java tenha tipagem estática.

[quote=aeciovc]mas… se o Ruby eh fortemente Tipada… o que dizer do Java então???

ALTAMENTE EXTRA FORTEMENTE TIPADA???
[/quote]
Não. Uma coisa é ser dinâmica ou estaticamente tipada, outra é ser fraca ou fortemente. Uma coisa não tem nada a ver com a outra.
Tipagem forte ou fraca tem a ver com a conversão implícita de tipos.

Isso é uma tipagem fraca (Java):

String s = "a" + 5; // resultado: "a5"

Isso é uma tipagem forte (Python): s = "a" + 5 # TypeError: cannot concatenate 'str' and 'int' objects
Dizer que uma tipagem é “forte” ou “fraca” acho que só tem sentido se comparada a outra. Ex: a tipagem de Ruby e Python são mais fortes que a de Java.

Acho que em metade das apresentações que envolvem Java que assisti, o apresentador disse que Java tem tipagem forte por achar que é o mesmo que tipagem estática… :?

A concatenação de strings em Java é apenas uma conveniência dada ao programador. Todos os objetos em java possuem um tipo associado, logo Java é fortemente tipado, assim como toda variável pode ter apenas um tipo de valor associado em um determinado momento, isto é, estaticamente tipado.

Ops, falei besteira. :oops:

Estou há tantos meses sem programar em Java que esqueci que ele é fracamente tipado.

[quote=marcobiscaro2112][code]

<?php if ("linguagem" + " não " + "tipada" == "loucura total") { echo "mude para o java!"; } ?>

[/code]
Isso porque a concatenação em PHP não se dá através do sinal de mais, e sim através do ponto. Usando o sinal de mais, ele considera uma soma. E o valor dessas strings na soma é sempre zero. Logo, aquilo seria o mesmo que escrever:

[code]

<?php if ((0 + 0) == 0) { echo 'são iguais!!!'; } ?>

[/code][/quote]

Hahaha, genial. Também não havia entendido e entendi agora com tua explicação, valeu!