PHPもやってみよう 8月25日 Part2
PHP言語(Rubyにはない)
switch文
複雑な条件分岐をシンプルにする
- if文を使用した場合
if($door == 0){ echo "ドアを開ける"; }elseif($door == 1){ echo "ドアを閉める"; }else{ echo "エラー" }
- switch文を使用した場合
switch($door){ case 0: echo "ドアを開ける"; break; case 1: echo "ドアを閉める"; break; default: echo "エラー"; break; }
break命令
現在のブロックから抜け出すための命令
break命令を忘れてしまうと、ブロックから抜け出せず、次のブロックも実行される
ちょっと今のところ謎部分を記載します
break命令文を忘れると実行されるべき部分を実行した後、その後も実行してしまうらしい
下の場合だと、表示されるのは
"ドアを開けるドアを閉める"
になるとのこと
条件式未達成なのになんで??
break命令文がないと、「又は」になるのかな??
//$door == 0 switch($door){ case 0: echo "ドアを開ける"; case 1: echo "ドアを閉める"; break; default: echo "エラー"; break; }
*私的注意点
case 0 :
この「:」が忘れそうで注意
PHPもやってみよう 8月25日
PHPとRubyで違うなと感じたところ Part2
- 文字列の連結
Rubyの場合
プラス(+)を使用して連結する
puts "あいう"+"えお" # => あいうえお n = "あいう" m = "えお" puts n+m # => あいうえお
PHPの場合
ドット(.)を使用して連結する
連結にも省略が可能らしい
"あいう"."えお"; //=> あいうえお $n = "あいう"; $m = "えお"; echo $n.$m; // => あいうえお $name = "山田"; $name.= "太郎"; // => $name."太郎" echo $name; // => 山田太郎
data = "アンケートデータ" puts "#{data}を見せてください"
$data = "アンケートデータ"; echo "{$data}を見せてください";
Rubyの場合
x = 101 if x>100 puts "100より大きい" end
PHPの場合
x = 101 if (x>100){ puts "100より大きい"; }
PHPにはelseif文、else文などを使う場合がある
Rubyに似ている!!
注意点
Rubyーelsif,else
PHPーelseif,else
if(条件式){ trueの場合 }else{ falseの場合 }
- 条件否定の場合
もし、「〜でない場合は〇〇を表示」という場合は「!」を使う
if !(条件式){ 条件式否定時の処理 }
Cherry本勉強中 8月25日
文字列について
文字列はシングルクオート('')、ダブルクオート("")だけではなく、%記法でも作ることが可能
cherry本でこれを読んで、最初はシングル・ダブルクオートだけで良いのでは?と考えたけども、文字列内にシングル・ダブルクオートを表示したい場合などに有効だなと考え直しました。
%q! !/ %Q! ! /%! !
%q! ! => シングルクオートと同じ
puts %q!私は'これは何?'と言った!
%Q! ! => ダブルクオートと同じ %! ! => ダブルクオートと同じ
data = "りんご" puts %Q!この果物は#{data}ですか?! puts %!この#{data}はここで育ったものですか?!
ここで使用した! !ですがこれは? ?や^ ^でもOKです。また( )、[ ]、{ }なども使えます
ヒアドキュメント
puts "line1, line2"
line1, line2
しかし、このような形は長文には適さないので、もっとスッキリする形を使う
<<識別子 1行目 2行目 3行目 識別子
<利用例>
a = <<text これは利用例です。 こういう形式は 複数行に渡る長い文字列を作成する時に便利です。 text puts a
これは利用例です。 こういう形式は 複数行に渡る長い文字列を作成する時に便利です。
- <<-を使うと最後の識別子をインデントさせることができる
def test <<-text これは利用例です。 <<-を使用すると最後の識別子をインデントできます。 text end puts test
これは利用例です。 <<-を使用すると最後の識別子(text)をインデントできます。
ちなみにこうするとエラーになります (<<-を使用していないからインデントが通用していない為です)
def test <<text これは利用例です。 使用しないとエラーになります text end puts test
<<~を使うと内部文字のインデントが無視されます
def test_2 <<~text これは利用例です。 <<~を使用するとインデントを無視します text end puts test_2
これは利用例です。 <<~を使用するとインデントを無視します
ちなみにこれを<<-にするとどうなるか
def test_2 <<-text これは利用例です。 <<~を使用するとインデントを無視します text end puts test_2
これは利用例です。 <<~を使用するとインデントを無視します
↑こちらはインデントされているのがわかるでしょうか?
ヒアドキュメントには式展開が有効!
fruit = "りんご" f = <<text いらっしゃいませ、お客様! 本日のオススメフルーツは#{fruit}です! text puts f
いらっしゃいませ、お客様! 本日のオススメフルーツはりんごです!
ちなみに式展開を無効にするには↓のようにします
fruit = "りんご" f = <<'text' いらっしゃいませ、お客様! 本日のオススメフルーツは#{fruit}です! text puts f
いらっしゃいませ、お客様! 本日のオススメフルーツは#{fruit}です!
ヒアドキュメントは引数になる
a = "ご" # prependは渡された文字列を先頭に追加するメソッド a.prepend(<<text) いち に さん よん text puts a
いち に さん よん ご
<<識別子に対してメソッドを呼び出せる
#作成した文字列に、直接upcase(文字列を全て大文字にするメソッド)を呼び出す b = <<text.upcase abc def text puts b
ABC DEF
とりあえず、ここまでにしたいと思います。 ちょっと眠いので(笑)
参考 「プロを目指す人のためのRuby入門」 参照 ヒアドキュメント - Wikipedia
Cherry本勉強中 8月23日
FizzBuzz問題
下記条件をクリアした、fizz_buzzメソッドを作成する
def fizz_buzz(n) if n%15 == 0 "Fizz Buzz" elsif n%3 == 0 "Fizz" elsif n%5 == 0 "Buzz" else n.to_s end end puts fizz_buzz(1) puts fizz_buzz(2) puts fizz_buzz(3) puts fizz_buzz(4) puts fizz_buzz(5) puts fizz_buzz(6) puts fizz_buzz(15)
cherry本はここまででしたが、プログラミングスクールでのカリキュラムには繰り返しも載っていたので、「どんなだっけ」と思ってやってみました。
def fizz_buzz(n) if n%15 == 0 "Fizz Buzz" elsif n%3 == 0 "Fizz" elsif n%5 == 0 "Buzz" else n.to_s end end n = 1 while n <= 100 do puts fizz_buzz(n) n += 1 end # 1~100まで繰り返す
whileのことちょっと忘れててショックでした(笑)
参考 「プロを目指す人のためのRuby入門」
Cherry本勉強中 8月22日 Part2
真偽値と条件分岐
Rubyの真偽値
- falseまたはnilであれば偽
- 上記以外は全てtrue
注意点 falseは勿論ですが、nilも偽に入ることを頭に入れておく
他の言語だとnilは偽に入らないらしい
どう違うのか
例えば、データがあるかないかの確認をする場合
他の言語だとif文を使用して、nilかそうでないかを条件分岐する
Rubyだとデータがtrueかtrueじゃないかを表す
data = "test_data" if data != nil puts "データあります" else puts "データありません" end #上下どちらも"データあります"がコンソールに表示される data = "test_data" if data puts "データあります" else puts "データありません" end
つまり、nilかどうか確認しなくても、trueを確認できる
論理演算子
論理演算子とはプログラミング言語などに用意された、論理演算を表す記号や符号などのこと。
真(true)と偽(false)の二値からなる真偽値(真理値/ブール値)に対して演算を行うことができる
論理演算子を使用することで、複数の条件を1つにまとめることができる && => かつ || => または
ちなみに&&と||の場合、&&の方が優先順位が高いそうです 私全く知りませんでした(笑)
- おまけ !演算子を使うと真偽が逆になる ()に!を使用すると()の中の真偽も逆になります
t1 = true t2 = true f1 = false f2 = false !(t1 && f1) # ture
if文
if文を使って下記のような代入ができることを初めて知ったので、記載したいと思います。
country = "italy" greeting = if country == "japan" "こんにちは" elsif country == "us" "Hello" elsif country == "italy" "ciao" end puts greeting
参考 「プロを目指す人のためのRuby入門」
PHPもやってみよう 8月22日
現在、cherry本でRuby学習を深めているところですが、PHPも気になるので、同時進行でPHPもやっていこうと思います。
混乱しないように気をつけます。
現在はprogateを使ってPHPをやってみています。
Rubyとの違いについてとかも、ブログに書いていけたらなと思います。
PHPとRubyで違うなと感じたところ
- HTML埋め込み式
とりあえず、Rubyと違うなと思ったところ、いきなりHTMLに記述させるところですかね
まだ、始めたばかりなので、これから変わるのかもしれませんが、HTMLに埋め込み式だとは思いませんでした。
RubyもHTMLに出せますが、別のファイルで処理したものを表示って形だったので...
これから学んでいけば変わるのかな...?
- セミコロン(;)
文末には必ずセミコロン(;)を付けて文を区切る
セミコロンを忘れるとエラーが出る
Rubyはこれがいらないので、間違いそう〜
- 変数
変数の表示の仕方に違いがありました
Rubyはそのまま
data = "8月22日" # これで、変数dataに"8月22日"が代入された形になります puts data # コンソールには"8月22日"と表示される
PHPだと
$data = "8月22日"; // これで、変数dataに"8月22日"が代入された形になります echo $data; // コンソールには"8月22日"と表示される
PHPの変数名の付け方 単語か単語を2つ以上つける場合はキャメルケース(大文字区切り)をする
良い例
=> $data => $firstDate
$x = 1; $x += 1; ==> $x ++ ; $x -= 1; ==> $x --;
足し算でも引き算でも1の場合は上記のような省略が可能だそうです。 また、下記のようなやり方もできるそうです。
$x = 1; echo ++$x; //2が表示される echo $x++;// 1が表示される(表示された後1が足されるとのこと。繰り返しとかに使うのかな?)
これをみた私の感想、1だけこれとかややこしくないのだろうか?でした(笑)
Cherry本勉強中 8月22日
cherry本学習
to_◯メソッド
to_i => 文字列を数値に変換
to_f => 文字列を小数に変換
小数だとメソッド変わることを初めて知りました。
to_s => 数値を文字列に変換する
丸め誤差注意
- 丸め誤差
=> コンピュータ内が10進数ではなく、2進数で計算するために生じる誤差でこれによってバグが生じる可能性がある
=>この本を読んだ時は最初、小数点のもの全てがこのバグを生じるのかなと思いましたが、そういうわけでもないようです。コンソールを使って確認してみました。(この後記載するrを使用してますが比較のために載せているので、スルーしてください)
puts 0.1r * 3.0r #3/10 puts 0.1 * 3.0 #0.30000000000000004 puts 0.1r * 3.0r == 0.3 #true puts 0.1 * 3.0 == 0.3 #false puts 0.1r * 2.0r #1/5 puts 0.1 * 2.0 #0.2 puts 0.1r * 5.0r #1/2 puts 0.1 * 5.0 #0.5 puts 0.1r * 6.0r #3/5 puts 0.1 * 6.0 #0.6000000000000001 puts 0.1r * 7.0r #7/10 puts 0.1 * 7.0 #0.7000000000000001
誤差の回避方法
では、このようなバグの元となる誤差をどのように回避するのか
=> Rationalクラスの数値に変換する
=> Rationalクラス ー 有理数クラスのことで、有理数とはa/bと言った分数で表せる数のこと
- 小数そのままの場合
=> 小数に"r"をつけることで、Rationalクラスの数値になる
0.1r # 1/10 3.0 # 3/1 0.1r * 3.0r #3/10 0.1r * 3.0r == 0.3 # true
- 小数を変数に代入している場合
rationalizeメソッドを使用する rationalizeメソッド => Rationalクラスの数値に変換する
a = 0.1 b = 3.0 puts a.rationalize * b.rationalize
- Rational(有理数)から普通の小数に戻したい場合
to_fメソッドを使用する
(0.1r * 3.0r ).to_f # 0.3
分数を計算したい場合
これはCherry本には載っていなかったのですが、気になって調べました 私下記の方法でいけると思っていたのですが、いけないんですね(笑)
(1/10)*(3/1) # 0
リファレンス確認しました
Rational(1,10) * Rational(3,1) #3/10 Rational(1,10) # 1/10 Rational(3,1) # 3/1
このようにすることで、分数の計算ができることがわかりました。
参考 「プロを目指す人のためのRuby入門」