Como pode acontecer isso no PHP??  XML
Índice dos Fóruns » Assuntos gerais (Off-topic)
Autor Mensagem
tonyam
JavaBaby
[Avatar]

Membro desde: 29/03/2006 14:17:03
Mensagens: 88
Offline


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?
aeciovc
Java Ninja

Membro desde: 28/02/2008 21:15:34
Mensagens: 267
Localização: Recife
Offline

é "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!


Aécio Costa
www.aeciocosta.com.br
[WWW] [MSN]
marcobiscaro2112
JWizard

Membro desde: 01/12/2008 11:56:04
Mensagens: 2408
Localização: São Paulo - SP
Offline


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:

Marco Biscaro.

Seja livre!

Você sabia que provavelmente há milhares de arquivos duplicados no seu computador?

Ei... você está usando DefaultTableModel no seu projeto?? Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[Email] [WWW] [MSN]
marcobiscaro2112
JWizard

Membro desde: 01/12/2008 11:56:04
Mensagens: 2408
Localização: São Paulo - SP
Offline

Tanto que a forma correta funciona como esperado:

O código acima não imprime nada.

Marco Biscaro.

Seja livre!

Você sabia que provavelmente há milhares de arquivos duplicados no seu computador?

Ei... você está usando DefaultTableModel no seu projeto?? Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[Email] [WWW] [MSN]
Rubem Azenha
GUJ Master
[Avatar]

Membro desde: 28/06/2004 00:10:43
Mensagens: 1933
Localização: São Paulo, SP
Offline

aeciovc wrote:
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


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

This message was edited 1 time. Last update was at 17/06/2009 20:30:27




Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning
[WWW]
aeciovc
Java Ninja

Membro desde: 28/02/2008 21:15:34
Mensagens: 267
Localização: Recife
Offline

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

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:



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

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


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!!



Aécio Costa
www.aeciocosta.com.br
[WWW] [MSN]
aeciovc
Java Ninja

Membro desde: 28/02/2008 21:15:34
Mensagens: 267
Localização: Recife
Offline

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!!

Aécio Costa
www.aeciocosta.com.br
[WWW] [MSN]
Felagund
GUJ Master
[Avatar]

Membro desde: 26/07/2006 11:51:36
Mensagens: 1732
Localização: Santa e Bela Catarina
Offline

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.

att
Rafael Felix

Rolling With Code
Twitter
[WWW]
tchandy
JavaChild
[Avatar]

Membro desde: 12/03/2007 21:18:49
Mensagens: 114
Localização: Jaraguá do Sul - SC
Offline

Felagund wrote: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.


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

Você pode ter todo dinheiro do mundo, mas há algo que jamais poderá comprar... Um Dinossauro!
(Homer J. Simpson)



http://thiagopradi.net | http://github.com/tchandy
[MSN]
elomarns
JavaGuru
[Avatar]

Membro desde: 21/04/2006 11:36:58
Mensagens: 241
Localização: Duque de Caxias/RJ
Offline

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:



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.

This message was edited 1 time. Last update was at 18/06/2009 12:42:39


Elomar Nascimento dos Santos.

Não clique aqui
Nem aqui
aeciovc
Java Ninja

Membro desde: 28/02/2008 21:15:34
Mensagens: 267
Localização: Recife
Offline

Tem a ver como foi implementada a concatenação de strings no PHP


é 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...)!

Aécio Costa
www.aeciocosta.com.br
[WWW] [MSN]
elomarns
JavaGuru
[Avatar]

Membro desde: 21/04/2006 11:36:58
Mensagens: 241
Localização: Duque de Caxias/RJ
Offline

aeciovc wrote:
Tem a ver como foi implementada a concatenação de strings no PHP


é 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...)!

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).

Elomar Nascimento dos Santos.

Não clique aqui
Nem aqui
Felagund
GUJ Master
[Avatar]

Membro desde: 26/07/2006 11:51:36
Mensagens: 1732
Localização: Santa e Bela Catarina
Offline

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.

att
Rafael Felix

Rolling With Code
Twitter
[WWW]
elomarns
JavaGuru
[Avatar]

Membro desde: 21/04/2006 11:36:58
Mensagens: 241
Localização: Duque de Caxias/RJ
Offline

Felagund wrote: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.

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:



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.

Elomar Nascimento dos Santos.

Não clique aqui
Nem aqui
aeciovc
Java Ninja

Membro desde: 28/02/2008 21:15:34
Mensagens: 267
Localização: Recife
Offline

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

ALTAMENTE EXTRA FORTEMENTE TIPADA?????


o Ruby consegue fazer isso??




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??


Aécio Costa
www.aeciocosta.com.br
[WWW] [MSN]
 
Índice dos Fóruns » Assuntos gerais (Off-topic)
Ir para:   
Powered by JForum 2.1.8 © JForum Team