Vendo no http://desciclo.pedia.ws/wiki/PHP esse código do PHP,
não acreditei, mas é verdade.
Essa instrução é verdadeira. Alguém pode explicar isso?
Vendo no http://desciclo.pedia.ws/wiki/PHP esse código do PHP,
não acreditei, mas é verdade.
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
<blockquote> 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!)
<blockquote><?php
if ((‘1 galinha’ + ‘2 pardais’) == ‘3 aves’) {
echo ‘são iguais!!!’;
}
?> </blockquote>
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.
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/
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…)!
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.
Ruby tem tipagem dinamica.porém vc não pode fazer
pessoa = "X"
pessoa = Pessoa.newvocê 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 //okEssa é magica que o PHP não possui.
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??
j = "1 Me Ajude"
i= 0
j = i
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??
mas... se o Ruby eh fortemente Tipada... o que dizer do Java então???ALTAMENTE EXTRA FORTEMENTE TIPADA?????
o Ruby consegue fazer isso??
j = "1 Me Ajude" i= 0 j = io 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??
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.
mas… se o Ruby eh fortemente Tipada… o que dizer do Java então???ALTAMENTE EXTRA FORTEMENTE TIPADA???
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.
Hahaha, genial. Também não havia entendido e entendi agora com tua explicação, valeu!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 ("linguagem" + " não " + "tipada" == "loucura total") { echo "mude para o java!"; } ?><?php if ((0 + 0) == 0) { echo 'são iguais!!!'; } ?>
"
Com licença que eu vou explicar pra vocês de uma vez por todas o que é linguagem fortemente tipada e fracamente tipada. Fortemente tipada é a linguagem de que eu gosto; fracamente tipada é a linguagem que eu quero esculhambar.
Alguma dúvida?
Com licença que eu vou explicar pra vocês de uma vez por todas o que é linguagem fortemente tipada e fracamente tipada. Fortemente tipada é a linguagem de que eu gosto; fracamente tipada é a linguagem que eu quero esculhambar.Alguma dúvida?
mas… se o Ruby eh fortemente Tipada… o que dizer do Java então???ALTAMENTE EXTRA FORTEMENTE TIPADA???
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… :?
Gente, o que é isso? Salada de frutas sabor Java, Ruby e PHP? O que tem a ver Tipagem Forte/Fraca com concatenação? Se java consegue converter para concatenar, ótimo. Acho que o erro é do desenvolvedor acreditar que a linguagem tem que sair ajudando em tudo. Se ele depender disso, então não precisa aprender a programar na linguagem.
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.
Eu sei, foi cruel. Mas eu concordei. 
Mas quando se faz “a” + 5 em Java nao eh o compilador que faz as conversoes? Eh diferente de javascript/php onde sao feitos em Runtime acho
Esse conceito de tipagem fraca/forte eh muito confuso e nao tem definicao certa. E acho meio estranho considerar Ruby tipagem forte soh porque o metodo ‘+’ solta excessao se for classes diferentes, isso eh detalhe de API, qualquer um pode sobrescrever esse metodo e fazer ele aceitar qualquer objeto, fazendo as conversoes necessarias
Acho melhor usar os termos tipagem estatica (onde o compilador faz as checagens) e dinamica (onde essas checagens sao feitas em runtime pelo interpretador) e esquecer esse papo de tipagem forte/fraca 
"
É muito comum ver alguém falar asneira quando vai falar linguagens com tipagem dinâmica. Principalmente se estiverem falando mal de PHP ou Javascript, o que parece que está na moda ultimamente.
Esse conceito de tipagem fraca/forte eh muito confuso e nao tem definicao certa. E acho meio estranho considerar Ruby tipagem forte soh porque o metodo ‘+’ solta excessao se for classes diferentes, isso eh detalhe de API, qualquer um pode sobrescrever esse metodo e fazer ele aceitar qualquer objeto, fazendo as conversoes necessarias
Quando se diz que uma linguagem tem tipagem forte isso significa que ela é type safe, ou seja, não se pode fazer operações ilegais com um tipo. Por exemplo, em Ruby não se pode somar uma string com um inteiro. Isso não tem nada a ver com detalhe de API, de onde você tirou isso?
Java é fortemente tipada.
Isso é açucar sintático:
Na verdade o que acontece é algo parecido com:
Se você tentar fazer alguma operação com a variável s, como tentar colocá-la em uma lista de inteiros, você vai ter um erro de tipos. Isso é ser fortemente tipada.
Por último, uma dica: pelo amor de Deus, não digam que uma linguagem é ruim porque ela tem tipagem dinâmica ou fraca. Vocês vão passar vergonha se tiver por perto um programador que sabe quais as vantagens e desvantagens de tipagens estáticas/dinâmicas/fracas/fortes.
Na wikipedia tem pelo menos 9 conceitos diferentes q certos autores usam pra definir linguagem de "tipagem forte", por isso q disse q eh ambiguo
http://en.wikipedia.org/wiki/Strongly_typed_programming_language
"Fixed and invariable typing of data objects. The type of a given data object does not vary over that object's lifetime. For example, class instances may not have their class altered."
Se usar esse conceito aqui entao Ruby/Python nao sao linguagens fortes
No topico tinha gente dizendo q Java nao era "tipagem forte" soh pq o compilador faz essas conversoes no '+' por conveniencia
E eu falei que eh detalhe de API pq apesar do metodo '+' do Ruby checar por tipos diferentes, diversos outros metodos no Ruby nao fazem isso. Arrays em Ruby por exemplo permitem vc adicionar objetos de qualquer tipo nele ao mesmo tempo (o que eh estranho pra quem vem de Java)
Eu posso ate alterar o metodo + de Fixnum pra ele aceitar soma de numeros com String
class Fixnum
alias_method 'old_+', '+'
def +(value)
send('old_+', value.to_i)
end
end
puts 1 + '2'
o codigo acima imprime 3
Eu posso ate alterar o metodo + de Fixnum pra ele aceitar soma de numeros com Stringclass Fixnum alias_method 'old_+', '+' def +(value) send('old_+', value.to_i) end end puts 1 + '2'o codigo acima imprime 3
"
apesar de polêmico…
já deu pra entender essas questões de Tipagem! :lol:
Olá rapaziada,
Estava navegando e me deparei com essa heresia no Forum do GUJ, rs
Desculpe-me a intromissão, eu não sou fã de foruns, não tenho habito de ficar debatendo horas e horas sobre linguagens mas não pude deixar de informar aqui a realidade do exempo citado no tópico.
Na verdade esse fato ocorre por causa de uma particularidade de muitas linguagens chamada TYPE CASTING. Isso não é só do PHP, talvez seja somente para este exemplo, mas muitas outras linguagens tem cast.
Ocorre porque o operador ‘+’ no PHP é usado somente para SOMA e nao para CONCATENAÇÃO rs… Como ele tenta SOMAR os operadores, Ele faz o cast da string “1 seila o que” para o unico numerico q ele encontra na string, ou seja, o 1. Soma à string “2 nao sei oqlá” que novamente Casta para 2. DEpois compara com o “3 aves seila” que comparado com o numerico da soma, casta novamente, aproveitando somente o 3 efetuando a igualdade verdadeira. Ele faz isso baseado na propriedade de que quando você instancia variáveis de numeros como string, o cast é feito automaticamente. Fazendo com que seja verdadeira, somas como ‘3’+‘5’…
Lembrando que isso é considerada PARTICULARIDADE da linguagem… Assim como Java tem as suas, C# também, Python, etc…
Eu particularmente sou contra falarem mal da linguagem pois não existe linguagem ruim, existe programador ruim. Dizer que PHP é uma porcaria é assinar embaixo de “Utilizei indevidamente a linguagem para fazer bacalhau. Passou, mas deu merd… lá na frente…”
POG que é POG nao precisa usar o PHP pra fazer cagada… Faz em qualquer uma! Assim como o bom programador faz um codigo seguro usando as particularidades do PHP, sem problema algum.
Desculpe se ofendi alguém, não foi intencional… Só não fiquem bitolados em uma única vertente… mente aberta!.. rs
Abraço a todos

1 ano e 3 meses que esse topico estava morto…
Fiquei até com vergonha de le a merda que falei no começo da discução ahuauhuhauha…
Eu gostei do termo “castar”. O PHP “casta” uma string com o operador “+”.
E para dizer em muitas palavras o que já havia sido dito em poucas palavras lá na primeira página…
Gostou?
Verbo devidamente aportuguesado conforme a necessidade… Dá até pra conjugar!!
Abraços
Sua explicação faz sentido mas não invalida argumentos anteriores. O fato de fazer casts arbitrários faz de PHP uma linguagem fracamente tipada. Uma apresentação que pode ajudar:
[]s
Saudações amigo,
Realmente a linguagem envolve uma baixa tipagem e um cast dinâmico.
E não os casts não são arbitrários, você não deve ter se acostumado com eles, ou simplesmente não os deve ter levado a sério como uma regra ou premissa da linguagem.
E definitivamente fazer sentido não, É exatamente o que expliquei.
Compreenda que o fator que me fez responder o tópico é que o mesmo foi fechado com respostas absurdas sobre a dúvida em questão. Em alguns anos de experiência em desenvolvimento, descobri que tem fatores maiores que influenciam muito mais na qualidade do software que a linguagem em si.
Grande abraço, foi bom conhecer vocês.
Gustavo Henrique
…
1 ano e 3 meses que esse topico estava morto…
Fiquei até com vergonha de le a merda que falei no começo da discução ahuauhuhauha…
Eu ja estava na segunda pagina todo empolgado, ja pensando numa resposta, quando resolvo olhar a data do post :shock: :shock: :lol: :lol:
Eu gosto do PHP dá pra fazer uns freelas massa. Agora teve muita bobagem ai hein, taradões do Java.
E não os casts não são arbitrários
São arbitrários porque não fazem sentido dentro do sistema de tipos, eles “quebram as regras”, trapaceiam. Isso faz a tipagem ser fraca, você não consegue provar baseado apenas nas regras do sistema de tipos que um programa é válido, seja em runtime ou compilação. É um tema relativamente abstrato e não invalida a utilidade de PHP, Perl ou outra linguagem fracamente tipada, entretanto.
Para entender melhor eu recomendo a leitura deste paper (que, apesar do tema cabuloso, é bem tranquilo de ler):
http://lucacardelli.name/Papers/TypeSystems.pdf
E deste livro (mais complicado):
Além da apresentação que linkei antes.
[]s
Caro amigo rcalcado,
É até estranho debater este assunto dessa forma pois parece que estou falando de laranjas e você de bananas… rs
Quanto as chamadas “trapaças” acredito que seja um infeliz comentário pouco embasado não somente no texto PDF que você mandou o qual na página 4, cita a linguagem C como também fracamente tipada entretanto não impediu que fosse largamente utilizada até mesmo para desenvolver SO´s até hoje, nao é mesmo?
Conforme havia dito antes bons programadores aprendem a utilizar a linguagem e não adequam a sintaxe ao seu uso.
Quanto as “tipagens trapaceiras” do PHP parecem ser propostas da linguagem desde seu lançamento pois então é preciso acostumar-se com elas.
Abraço,
Gustavo
Caro amigo rcalcado,É até estranho debater este assunto dessa forma pois parece que estou falando de laranjas e você de bananas… rs
Quanto as chamadas “trapaças” acredito que seja um infeliz comentário pouco embasado não somente no texto PDF que você mandou o qual na página 4, cita a linguagem C como também fracamente tipada entretanto não impediu que fosse largamente utilizada até mesmo para desenvolver SO´s até hoje, nao é mesmo?
Logo…? O que ser fracamente tipada ou não tem a ver com ser amplamente utilizada, ser útil ou qualquer outra coisa?
A situação é simples: PHP é fracamente tipada. Pode ser uma linguagem fantástica para desenvolvimento web mas isso não tem nada a ver com tipagem. E esse foi exatamente o meu ponto no post anterior.
A propósito, tipagem não é sintaxe.
Caro amigo rcalcado,É até estranho debater este assunto dessa forma pois parece que estou falando de laranjas e você de bananas… rs
Quanto as chamadas “trapaças” acredito que seja um infeliz comentário pouco embasado não somente no texto PDF que você mandou o qual na página 4, cita a linguagem C como também fracamente tipada entretanto não impediu que fosse largamente utilizada até mesmo para desenvolver SO´s até hoje, nao é mesmo?
Conforme havia dito antes bons programadores aprendem a utilizar a linguagem e não adequam a sintaxe ao seu uso.
Quanto as “tipagens trapaceiras” do PHP parecem ser propostas da linguagem desde seu lançamento pois então é preciso acostumar-se com elas.
Abraço,
Gustavo
Quer aprender o mínimo do que é sistema de tipos em linguagem de programação?
http://en.wikipedia.org/wiki/Type_system
É um bom começo pra você ao menos saber o que é e pra que server. Pode ser bem útil pra continuar a discussão.
Acho que o que o pcalcado colocou foi apenas em relação a tipagem em si, sem entrar nos méritos de qualidade da linguagem…
Digamos que o tópico começou meio aloprado, melhorou no meio e se resolveu no fim…
Vejo como tópico fechado… Hoje utilizao PHP + Zend para os Freelas… Não tenho do que reclamar… Basta evitar certas “facilidades” da Linguagem e tyrabalhar da forma mais OO possível… Pra WEB é sem igual…
Abs 
Mto bom adriano, muito bem colocado.
Um último adendo ao comentário do pcalcado sobre tipagem não ser sintaxe, segundo o link wikipedia do amigo le-silva
Na primeira linha do primeiro parágrafo define Type System como um framework sintático tratável.
No G**gle translate, como “como uma estrutura sintática tratável”
É bem interessante o conteúdo que me mandaram… Nunca aprendi tanto sobre tipagem.
GrAnDe abraçU .:
Gustavo Henrique .:
Essa definição vem do livro do Ben Pierce, que eu linkei em um post anterior (Pg 1-2). O que ele diz é que sistemas de tipos são um método para verificar termos (ou “syntactic phrases”). Como sua linguagem implementa estes termos em sua sintaxe é completamente irrelevante.
Notei que bastante gente se empolgou com o tema. Antes de ler Pierce, entretanto, provavelmente é melhor começar com:
ou
Bem pessoal,
acho que estão tratando dois aspectos diferentes de linguagens de programação, quaisquer que sejam, como a mesma coisa. Tipagem estática ou dinâmica é um pouco diferente de tipagem forte ou fraca. Numa linguagem de tipagem estática, cada variável precisa ter um tipo fixado, ao contrário de linguagens dinamicamente tipadas, onde as variáveis não precisam ter tipos declarados e, por isso, podem conter valores de tipos diferentes durante a execução do programa. Numa linguagem fortemente tipada, um valor de um tipo só pode ser operado com valores do mesmo tipo (pela definição). Já numa linguagem fracamente tipada, eu poderia operar valores de tipos diferentes entre si. Lembrando que os tipos ditos aqui se tratam de tipos genéricos, tais como tipos numéricos, cadeias de caractere, e não tipos específicos, como int, boolean, char, String.
Exemplo? Java, Python e C.
//exemplo em Java
public int exemplo1(int a) {
a = 2.5; //isso produz uma exceção
a = (int) 2.5; //o cast soluciona a exceção
return a;
}
//exemplo em C
float funcao(char a) {
float b;
b = a + 1.5; //isso não produz erro
return b;
}
Java e C são tipadas estaticamente, pois suas variáveis, funções (métodos) e retornos precisam ter um tipo de valores fixado. Java, por sua vez, é fortemente tipada, pois não permite operações entre dois tipos diferentes, como int e float. Já C, é fracamente tipada, pois permite operações entre char e float.
#exemplo em Python
def exemplo1(n):
return n % 2
Já Python é tipada dinamicamente, pois as suas variáveis e funções não precisam ter tipos fixados. E é fracamente tipada também, já que permite operações entre tipos diferentes.
Espero que tenha contribuído para esclarecer as dúvidas, e se tiver algum erro com as linguagens C e Python, não se assustem, não sou muito bom nelas. O intuito mesmo foi retirar a ambiguidade entre tipagem estática ou dinâmica e tipagem forte ou fraca.
O contrário. Python não permite:
>>> 'x' + 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects
>>> exemplo1('5')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in exemplo1
TypeError: not all arguments converted during string formatting
>>> exemplo1(5)
1
Rafael, eu tentei esclarecer a dúvida entre tipagem estática ou dinâmica e tipagem fraca ou forte, e disse que poderia conter erros na exemplificação usando as linguagens, já que não uso C e Python constantemente. Eu apenas exemplifiquei, não admiti isso como verdade absoluta porque não tenho conhecimento sobre as linguagens para afirmar tal coisa.
Agora faço uma pergunta. Qual linguagem de tipagem dinâmica tem tipagem fraca?
[]'s
JavaScript.
Detalhe que em Java você pode fazer a operação que Python não deixa. Forte ou fraca são relativos.
Schuenemann,
acho que quando a literatura fala de forte ou fraca é algo no âmbito de todas as linguagens de programação. Não afirmei que Python fosse fracamente tipada, mas achava que fosse. Depois do que Rafael mostrou passei a achar fortemente tipada.
Uma coisa que pode confundir são as conversões que o compilador faz durante a compilação. Por exemplo, em Java você supostamente poderia somar uma String com inteiros:
System.out.println("string" + 2);
Mas sabem que isso não ocorre. O que ocorre é que o compilador faz a inferência e o casting automático de tipos aqui. Na verdade, o que aconteceria, transpondo em código, seria:
System.out.println(new String("string") + new String(String.valueOf(2)));
Então Java continuaria sendo fortemente tipada juntamente a Python.
A explicação para isso é simples.
É que como PHP não é uma linguagem fortemente tipada, os tipos em expressões são resolvidos em tempo de execução pelo PHP.
Portanto, na conversão de strings para números as regras a seguir são válidas:
“5” = 5
“” = 0
“aves 5” = 0
“5 aves” = 5
Como podem perceber, a particularidade de conversão do PHP é que na conversão para tipo numérico, strings que começam com número (descartando espaços iniciais) são convertidas para esse número. Já se o número não está no início da string, ela é convertida para 0. Não é só com inteiro, é com números em geral.
Como é usado o sinal de soma, automaticamente o PHP tentará converter os tipos não adequados à uma soma, logo, na expressão
(‘1 galinha’ + ‘2 pardais’) == ‘3 aves’ o PHP está convertendo as strings para inteiros para efetuar a soma:
1+2 == 3. Essa é expressão depois da conversão.
Obviamente que você sabe que o “+” em PHP não serve para concatenar, porque você certamente não seria tão estúpido de criticar uma linguagem dessa forma sem antes estudar o mínimo acerca dela. Porém, o comportamento dessa conversão realmente é estranho.
Eu sou programador PHP. Na minha opinião, o problema do PHP é não ser tipado. Mas só isso não me faz escolher o Java, embora eu o use para Android. Mas seria uma ajuda para o progresso da humanidade se o PHP fosse fortemente tipado. Afinal não é a toa que profissionais e empresas escolhem o PHP. É porque o PHP é muito mais barato, fácil e o suporte dos servidores é muito maior.
Se programar para web em Java fosse fácil e barato como em PHP eu escolheria o Java. Ou o PHP poderia ser tão organizado como o Java aí eu não teria reclamações.