あずきみるくのあずきはニガテ - for Engineer

ひよっこプログラマがやってみたことやハマっちゃったことなど、備忘録的な感じで書いていきます。

JavaらーがPHPに出会った。 - 「へぇ~」を集めてみました

PHP、勉強することになりました。

基本、あずきはJavaらーです。
今までJavaと、htmlやcssjavascriptXMLなど、
javaにまつわるetcしか触ってきませんでした。


で、ここから、PHPの勉強をするのですが、
javaと違って、「へぇ~」となったことを書いていこうかと。
(あ、でもsysoutがechoとかprintになったとか、根本的なことは言語が違うんだしいいかな、と思ってます。単純に、こんなこともできるんだ、ってことで。)


有名なのは変数のスコープ?の話でしょうか。

<?php
$value = 5;
function hoge()
{
    $value += 3;
}
hoge();
echo $value;

これを見ると、Javaらーは「8」!って答えちゃうけど、ほんとは「5」が正解なんだよ~、っていう。

ここの記事、面白かったので、ぜひ続きを書いてほしいw
八角研究所 : Java使いのためのPHP入門(1)~JavaとPHPどちらが簡単か?

では、さっそく。
こんなのがあったよ♪

1)ヒアドキュメント

複数の文字列の記述方法。

javaだと・・・

"文字"
"文字"
"文字"

PHPだと・・・

<<<hoge
文字
文字
文字
hoge

こんな書き方もできるんだね。
で、早速書いてみた。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title>Test PHP</title>
</head>
<body>
<?php
print
<<< hoge
はじめまして。<br>
<あずき>です。<br>
好きな食べ物は"さくらもち"です。
hoge;
?>
</body>
</html>

でた。
f:id:azuki-milk-lush:20150205115134j:plain

・・・ただ、使いどころはいまいちわかんないw



これ、やってみて思ったこと。

コンパイルがいらないって楽だよね。
変更もすぐ反映されるし。

・・・さて、続き。

2)echoとprintの違い

echo  引数が複数
print 引数が一つ

って違いなのでしょうか。

ためしてみましょ。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title>Test PHP</title>
</head>
<body>
<?php
echo "2015","","2","","5","日<br>"; // 引数としていっぱい
print "2015年2月5日<br>"; // printは引数一つ
print "2015年"."2月"."5日<br>"; // 「.」で連結したら1つとみなされる
?>
</body>
</html>

とりあえず出ました。

f:id:azuki-milk-lush:20150205143654j:plain

ここで今更気づいた。

htmlファイルなのに、<br>タグは文字列として書かないと改行と認識されないのね。

あぶないあぶない。。。

3)オートボクシング?

なんか厄介そうだからメモメモ。。。

PHPでは文字列であっても、計算できちゃう!!
つまり、javaでよく見かけるNumberFormatException(だっけ?)は存在しない、ということだ。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title>Test PHP</title>
</head>
<body>
	<?php
		echo "3 + 8 = ", 3 + 8 , "<br>";
		echo "5 + 5.25 = ", 5 + 5.25 , "<br>";
		echo "6 + あずき = ", 6 + 'あずき', "<br>";
		echo "osaka20 + 20tokyo = ", 'osaka20' + '20tokyo', "<br>";
	?>
</body>
</html>

f:id:azuki-milk-lush:20150205144942j:plain

はわわ。。。。
計算されちゃったよ。。。

特に、「6 + あずき」と「osaka20 + 20tokyo」!!

なんてこと!!

どうやら文字列は「0」として認識されているようであります。

ついでに、文字列と数字の組み合わせでいうと、
頭が数字から始まっていれば、「数字として認識しちゃう」のだ!!

NumberFormatExceptionにやられていたjavaらーとしてはカルチャーショックを隠せません。。。orz
逆に怖い。


4)変数の型、どこ行った?

通常、Javaでは変数を宣言する時、必ず、型も含めて宣言しなければなりません。

 public String hoge = "";

なんなら、初期化してなかったり、宣言した変数を使ってなかったら警告まで出してくれる丁寧っぷり。(おせっかい?w)

ところがどっこい!
PHPだとこんなことができてしまう。。。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title>Test PHP</title>
</head>
<body>
	<?php
		$var = 'あずき';
		print '[値]:' . $var . '<br>';
		print '[型]:' . gettype($var). '<br>';
		
		print '--------------------------------';
		
		$var = 36;
		print '[値]:' . $var . '<br>';
		print '[型]:' . gettype($var). '<br>';
	?>
</body>
</html>

f:id:azuki-milk-lush:20150205150438j:plain

はわわわわわ・・・
奥さん、見ました?!

同じ変数なのに、型が変わりましたよ!!
なんてフレキシブルなんでしょう!!

ちょっとVBAのVariant型を思い出しました。。。
(でも、あいつはなんでも受け入れるだけで、型が変わるわけじゃないものね。。。)

PHPの変数・・・恐ろしい子!!

5)変数に格納されるのは値そのもの!!

javaでは参照渡し、だったような。

で、こんなことしてみました。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title>Test PHP</title>
</head>
<body>
	<?php
		$num1 = 1;
		$num2 = 2;
		print "$num1 : " . $num1 . " / num2 : " . $num2 . "<br>";

		$num2 = $num1;
		print "$num1 : " . $num1 . " / num2 : " . $num2 . "<br>";

		$num1 = 5;
		print "$num1 : " . $num1 . " / num2 : " . $num2 . "<br>";
	?>
</body>
</html>

f:id:azuki-milk-lush:20150205152150j:plain

・・・ん?
結果はさておき、なんか変だ。。。

ま、まさか!!
「""」で囲ってるのに、文字列として認識してない!!

「'」で囲うように変更したら、ちゃんと文字列として出てきました。

f:id:azuki-milk-lush:20150205152524j:plain

こんな違いもあるんだね。

ちなみに、参照渡しにしたいときは「=&」でやればできるそうな。そうな。


6)「===」と「!==」の存在

なんだこれ?!です。

が、「4)変数の型、どこ行った?」で紹介したように、代入された値によって型が変わる、ということの副産物なのかもしれません。

「==」はが等しいか、のみを確認します。
「===」は値と型が等しいか、を確認します。

そんなわけで、こんなの作ってみました。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title>Test PHP</title>
</head>
<body>
<?php
	$var = 20;

	if($var == '20'){
		print 'varは20です。';
	}

	print '<br>';

	if($var === '20'){
		print 'varは文字列の20です。';
	} else {
		print 'varは文字列の20ではありません。';
	}

?>
</body>
</html>

f:id:azuki-milk-lush:20150205154824j:plain

結果はご想像の通りだと思います。
へぇ~。

7)拡張for文はforeach

Javaの拡張for文は

for(String str : StringArray){
  // 処理
}

のように、
「for( 変数 : 配列変数 ){}」となりますが、PHPの場合は逆です。

「foreach( 配列変数 as 変数 )」となります。

foreach($sringArray as &str){
  // 処理
}

って感じでしょうか。

間違えやすそうだったのでメモメモです・・・

8)print_rで配列全部だし

配列に格納された値をすべて出力する時、Javaであればfor文でぐるぐる回す、っていうのが基本だったように思います。

でも、PHPなら、「print_r」だけで全部出してくれる。
なんと楽なのでしょう。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title>Test PHP</title>
</head>
<body>
<?php
	$array['azuki'] = 'みるく';
	$array['あずき'] = 'milk';

	print_r($array);
?>
</body>
</html>

f:id:azuki-milk-lush:20150205162833j:plain

出力時には改行くらいしていただきたいものですが・・・(あずきの設定が足りない?!)
とりあえず出力されました。

書式を変更できれば用途も広がりそうなものを・・・デバッグくらいなら便利なのかな?

9)メソッド=関数?!

VBAの時も思ってました。
Javaでいわゆるメソッドを書くとき、PHPでは「function」って書くんです。
関数、って呼んでるらしーんですよ。

・・・ふーん。

ちなみに、戻り値は指定しないようです。戻してもいいし、戻さなくてもいい。



* ここまでの所感

・・・いやー、言語違えばいろいろあるもんです。
基本だけをざーっと見てるのですが、今のところの感想としては・・・

** ◎いいところ◎

実行が簡単

Eclipseでちょこちょこっとコードを変えて、何かを再起動する手間もなく、ブラウザ実行したらすぐ反映される。
ステキです。

記述も簡単

かなりお手軽ですね。
基本的なところは大きな違いはないように思われます。
いきなりCとかだと、そもそもの指向が違うので、そこに慣れるのに時間がかかりそうですが、その心配は今のところなさそうです。

** ×いやなところ×

変数の型があいまい

これはきっと、Javaで慣れ親しんでいるからでしょう。
入れた値によって型を変えるのはフレキシブルで、いいとは思うのですが。。。
文字列まで計算できちゃったりするあたりは申し訳ないですが、すごい、より「うえぇ~?!」って感じです。

HTMLなのに、改行は文字列で<br>タグいれないといけない

・・・ずぼらなんです。これはめんどくさい。。。

   
そんなわけで、これからしばらくPHP、がんばります!!


<今回の先生>
PHP入門 - 基本構文の解説からデータベースへのアクセス方法まで