Este documento compara as linguagens PHP e Ruby, descrevendo suas histórias, paradigmas, tipagem, orientação a objetos dinâmica e comunidades. Ruby foi criada para ser mais poderosa que PHP e mais orientada a objetos que Python.
2. PHP
Perguntas iniciais
• Quem programa em PHP?
• Quem sabe o que é uma “variável variável”?
• Quem sabe o que é “paamayim nekudotayim”?
• Quem usa GOTO?
3. PHP
História
• Criada por Rasmus Lerdorf em 1994.
• Objetivo: Fazer um contador para a página pessoal de Rasmus.
• Originalmente era apenas uma biblioteca Perl.
• PHP3 escrito por Andi Gutmans e Zeev Suraski (Zend) em 1997/98
4. Ruby
História
• Criada por Yukihiro Matsumoto (Matz) em 1993.
• Objetivo: Criar uma linguagem poderosa que tenha uma “versão simplificada”
de programação funcional com ótima OO.
• Matz: “I wanted a scripting language that was more powerful than Perl, and
more object-oriented than Python. That's why I decided to design my own
language”
• Matz: “I hope to see Ruby help every programmer in the world to be
productive, and to enjoy programming, and to be happy. That is the primary
purpose of Ruby language.”
8. Ruby
Paradigma
• Procedural, totalmente OO com classes (Smalltalk-like), um tanto funcional
com o conceito de blocos. Not Haskell thought.
a = [1,2,3]
a.shift
=> 1
a.pop
=> 3
a.push(4)
=> [2,4]
10. Ruby
Tipagem
• Dinâmica e forte. (Aberta a mudanças.)
10 + “10”
=> TypeError: String can't be coerced into Fixnum
class Fixnum
alias :old_sum :+
def + s
old_sum s.to_i
end
end
10 + “10”
=> 20
13. Ruby
Fluxo
• if, unless ...
if i == j
...
end
unless cond
...
end
puts “Maior” if age >= 18
puts “Menor” unless user.adult?
14. Ruby
Fluxo
• ...case...
# default usage
case hour
when 1: ...
when 2: ...
end
# with ranges!
case hour
when 0..7, 19..23: puts “Good nite”
when 8..12: puts “Good mornin’”
end
15. Ruby
Fluxo
• ...case...
# with regexes
case date
when /d{2}-d{2}-d{4}/: ...
when /d{2}/d{2}/d{4}/: ...
end
# crie seu próprio case
class MyClass
def ===
...
end
end
21. Ruby
OO
• Classes e módulos.
module Walker
def walk
...
end
end
# módulo como “herança múltipla” ou “mixin”
class Johny
include Walker
end
22. Ruby
OO
• Classes e módulos.
# módulo como “namescope”
module Foo
class Bar
...
end
end
variable = Foo::Bar.new
23. PHP
OO Dinâmico
• __call: Chama métodos não existentes.
• __get: Chama “atributos” não existentes.
• __set: Chama ao tentar setar atributos não existentes;
$obj->metodo();
$obj->atributo;
$obj->atributo = “valor”;
24. Ruby
OO Dinâmico
• method_missing: Tudo em Ruby são chamadas de métodos.
obj.metodo # chama o método “metodo”
obj.atributo # chama o método “atributo”
obj.atributo = “valor” # chama o método “atributo=”
class Foo
def method_missing m, *args
...
end
end
32. Ruby
Comunidade
• RubyGems
gem install bundler # install gem
bundler gem my_gem # create my own gem
cd my_gem
rake release # that’s all folks
#also
bundler install # install all dependencies for a project