元PHPエンジニアがPHPとRubyを比較してみた

目次

はじめに

はじめまして。去年の6月に入社したチャン・ゾアン・タンと申します。

私はリンクバルに入る前にPHPエンジニアでした。RubyもRailsも未経験でした。入社してからRubyやRailsを勉強し始めました。以下の方法で勉強しました。

まず、Rubyを学ぶ

もともとPHPエンジニアだったので、Rubyを学んた時に、PHPと比較しながら学びました。

両方の言語はオブジェクト指向プログラミング言語(実は、Rubyはpureオブジェクト指向プログラミング、PHPはオブジェクト指向サポート言語と言われている)であるので、同様なものがあるかと思いました。この学び方でPHP知識に参照出来ると思います。

同様

まず、PHPとRubyは以下の通り同様なところがあると思います。

PHPとRubyとも型の指定せず変数を宣言できます

  • php
[php] $hoge = ‘linkbal’;
echo $hoge;

$arr = [1,2,3];
print_r($arr);
[/php]

  • ruby
[ruby] hoge = ‘linkbal’
puts hoge

arr = [1,2,3] puts arr
[/ruby]

オブジェクト指向プログラミング言語なので、両方PHPとRubyはpublic, protected, privateというアクセス修飾子を付けてクラスを宣言できる

配列

一次元配列は大体同じ、両方とも動的な配列がサポートされています。シンタックスも同様です。
Rubyで二次元配列がhashになります。

文字列補間

両方は文字列補間という文字列内に変数を埋め込むことができます。シンタックスも同様です。

  • php
[code lang=”php”] $a = ‘hogehoge’;
echo "hello {$a}";
[/code]
  • ruby
[code lang=”ruby”] a = ‘hogehoge’
puts "hello #{a}"
[/code]

パッケージ管理ツール

両方とも盛んな言語なので、コミュニティーが広いし、ライブラリーも豊富なので、パッケージ管理ツールが必要です。

PHPではComposerを使っています。
RubyではGemです

いくつか同じ関数

  • eval: ローコードスクリプトを実行する関数
  • spintf: 文字列をフォーマットするための関数

違い

シンタックス

  • 基本のシンタックス

PHPはC言語と同様、セミコロンでコードステートメントを終了にします。semicolon terminatedと言います。
クラス関数ループなどというブロックは{}が包まれます
RubyはPythonと同様、改行でコードステートメントを終了にします。newline terminatedと言います。
クラス関数ループなどというブロックは{}が要らない

[ruby] def method(a, b)
if a > b
puts ‘hoge hoge’
end
end
[/ruby]

以下の通り{}を使用するケースもあります。

eachメソッドのshorthand

[code lang=”ruby”] [1,2,3].each { |elm| puts(elm) }
[/code]

コードブロック

[code lang=”ruby”] def hoge
puts ‘welcome to’
yield
end
hoge { puts ‘Linkbal engineer blog’ }
[/code]

・Rubyでは全部オブジェクトで、シンタックスはわかりやすいし、すっきりだと思います。

文字列の長さを取得する

PHP

[code lang=”php”] echo strlen("welcome to linkbal engineer’s blog");
[/code]

Ruby

[code lang=”ruby”] puts "welcome to linkbal engineer blog".length
[/code]

・Rubyのシンタックスはかなりは柔軟です。
関数を呼び出す時、括弧があるかないかどちらもいけます。
Rubyの関数は最後の変数または表現がreturnの値になります。

[code lang=”ruby”] def hoge
1 + 1 # return 2
end
[/code]

If-else文は自然言語に近いので、結構わかりやすいです。

[code lang=”ruby”] # これは
# if a == b
# hoge = 10
# end
# と相当です
hoge = 10 if a == b
[/code]

Rubyでは逆の条件の場合、unlessが使える

[code lang=”ruby”] #「if a != 10 hoge = ‘test’」と相当です
hoge = ‘test’ unless a == 10
[/code]

こういうかき方もよく使われています。

[code lang=”ruby”] def hogehoge
‘test’ if a == 10
end
[/code]

Truthy/Falsy

Rubyではfalse, nilのみfalseを返します。0、空文字列、空配列がtrueです。
PHPではfalsenullfalseであることはもとより、0、空文字列、空配列もfalseです。

Rubyはabstractクラスとinterfaceともありません。

文字列の連結

PHPではdot(.)を使います。
Rubyでは+を使います。

変数種

PHPでは変数が1種類しかありません。

Rubyでは4種類があります。

[code lang=”ruby”] $variable # グローバル変数
@@variable # クラス変数
@variable # インスタンス変数
variable # ロカール変数
[/code]

コード規約

開発するには言語を学ぶことだけではなくて、コード規則を学ぶべきです。

PHPのコード規約は「PHP Standard Recommendation(PSR)」が一番盛んなものだと思います。

RubyではRubocopという静的解析ツールが結構有名で、うち会社のプロジェクトも使っているので、Rubycopのコード規約に参考しました。

Railsを学ぶ

プログラミング言語を学んだあと、Railsフレームワークを学びます。

PHPを開発した時、Laravelフレームワークを使っていました。
LaravelはRailsのようにモダンな「MVC」Webフレームワークであります。それに、Laravelの作者はLaravelを作ったときに、Railsに参考したということを言われています。そのため、LaravelとRailsは構造や機能の中に同様なものがあるかと思いました。

Model

Laravelでは「Eloquent」と言います。
Railsでは「ActiveRecord」と言います。

両方ともパワーフルORM(Object Relational Mapping)で、Model連携も便利です。

View

LaravelではBladeというテンプレートエンジンがあります。これで簡単にレイアウトを作れ、再利用もできます。

RailsではERBがあります。LaravelのBladeと同様です。

Controller

他の「MVC」フレームワークと同じで、RailsとLaravelはリクエストがルーターで処理したあと、コントローラーにいって、ロジックを処理されます。

その他

Rails Laravel
コマンドライン rails console php artisan
マイグレーション サポート(実行, ロールバック, リセット、初期データ生成) サポート (実行, ロールバック, リセット、初期データ生成)
ストレージ Active Storage File Storage
Websocket Action Cable Broadcasting
多言語 i18n Localization
ユニットテスト rspec PHPUnit

終わり

最初、Railsに触った時に、こういう方法でRubyやRailsを勉強しました。
そして、私の部署ではPull Requestは必ず二人以上のApproveがないとマージできないようになっているので、ソースレビューでチームメイトのコメントからもいろいろ勉強できました。だんだんRailsの開発に慣れました。

現在、うちの会社ではエンジニアを募集しています。ご応募お待ちしております!

参考

https://guides.rubyonrails.org/index.html
https://docs.ruby-lang.org
https://laravel.com/docs
https://github.com/rubocop-hq/ruby-style-guide