Como pode acontecer isso no PHP?

Eu gosto do PHP dá pra fazer uns freelas massa. Agora teve muita bobagem ai hein, taradões do Java.

[quote=GHSilva]
E não os casts não são arbitrários[/quote]

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

[quote=GHSilva]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?
[/quote]

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.

[quote=GHSilva]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[/quote]

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 :wink:

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.