Javaしか知らない人がPHPでコードを書くためにはじめに流し読みしておくと良いもの その1


巷ではどちらかというとPHPをやってきた人がJavaにチャレンジするための記事が多い気がしたので、Javaしか知らない人がPHPを書き始めるときに参考になればと思い書いてみました（いくつかの言語を渡り歩いてきた人はこのへんであまり困ってない気がする）。

そもそもプログラミング自体の経験がそこまでないので、曖昧な部分はご容赦ください。
※ すでにPHPのコードが実行できる環境が整っていることを前提にしています。

##おなじみ「Hello World!」


```hello.php
<?php
echo 'Hello World!';
```

はい、簡単ですね。
ファイル名は「*.php」とするとPHPで書かれたファイルと認識してくれます。また、「<?php」と「?>」でコードを囲うのが作法ですが、PHPのみのコードの場合には「?>」は付けないのが推奨です。付け忘れではありません。僕ははじめ、人のコードを読んでいて「?>」がなかったので、PHPerは怠惰だなぁとか思っていましたm(_ _)m

◇PHP タグ（公式リファレンス）
[http://php.net/manual/ja/language.basic-syntax.phptags.php](http://php.net/manual/ja/language.basic-syntax.phptags.php)

##変数

```variable.php
<?php
$num = 0;
$name = '名前だよ';
```
まず、PHPでは変数は変数名の前に「$」を付けます。始めは邪魔に見えますが、そのうち変数が一目で分かるので見やすくなってくると思います。
また、PHPでは型の宣言は行いません。ここがPHPのゆるふわの始まりです。

##配列

```array.php
<?php
//配列を定義する
$hoge = array();

//値のみの配列の場合
$foo = array('りんご', 'オレンジ', 'バナナ');
//配列への値の追加
$foo[] = 'もも';
//もしくは
array_push($foo, 'マンゴー');

//連想配列の場合
$bar = array(
	'Japan' => '安倍',
	'USA'	=> 'オバマ',
);
//連想配列への追加
$bar['Germany'] = 'メルケル';
```

PHPでは配列に「array()」を使用します。携わるプロジェクトによると思いますが、PHPでは連想配列をゴリゴリ使う場面が多いような気がします。

##クラス

```class.php
<?php
class Hoge
{
	//...
}
```

Javaと変わりませんね。なお、命名規則がどうとかは別としてPHPのクラス名は小文字から始めても全く問題ありません。

##メソッド

```method.php
<?php
class Hoge
{
	private $username = 'hogepon';
	private $num;

	//コンストラクタ
	public function __construct()
	{
	}

	public function get_username()
	{
		return $this->username;
	}
	
	//static関数の例
	public static function set_num($num)
	{
		$this->num = $num;
	}
}
```
「function」を上記の位置に書くことでメソッドを作ることができます。
また、変数の項目で述べたようにPHPでは型の取り扱いがJavaに比べるとかなりゆるふわです。そのためかどうかわかりませんが、メソッドの戻り値の型も明記しません（voidも書かない）。さらに、引数の型も明記しません。つまり、文法上はどんな型の引数でも受け付けることができます。でも引数で定義できる型もあったりします。

◇型宣言（公式リファレンス）
[http://php.net/manual/ja/functions.arguments.php#functions.arguments.type-declaration](http://php.net/manual/ja/functions.arguments.php#functions.arguments.type-declaration)

~~あと細かいですが、PHPではJavaでいう「メソッド」のことを「関数」と呼ぶみたい。~~PHPでもJava同様にクラス内の関数を「メソッド」と言います。
◇クラスの基礎（公式リファレンス）
http://php.net/manual/ja/language.oop5.basic.php
（2015.10.29　[tadsan](http://qiita.com/tadsan)さんからご指摘いただき修正しました。）

###コンストラクタ
コンストラクタは、Javaではクラス名で定義しましたが、PHPでは「__construct」で定義します。

###クラス内の関数、変数の呼び出し
ここで「\$this」が出てきてしまったので、その説明をします。
staticではない関数や変数はJavaと同様にthisを使って呼び出します。上記のコード（method.php）のように「\$this->num」と書きます。「\$this->\$num」のように変数名の前に「\$」は付けないことに注意してください。

###クラス内のstaticな関数、変数の呼び出し
staticな関数、変数の場合は少しJavaとは異なります。


```static.php
<?php
class Hoge
{
	private static $username = 'hogepon';
	
	public static function calc()
	{
		//なんか計算する
	}
	
	public function hoge()
	{
		//変数
		self::$username;
		
		//関数
		self::calc();
	}
}

//クラス外からは「クラス名::」で呼ぶ
Hoge::$username;
Hoge::calc();

```

基本的にはクラス内では「self::」を付けます。「static::」をつけることもできますが、この2つは場面によって動作が異なります。自分の言葉で説明できる自信がないので、リファレンスを参照してもらうことで逃げます。

◇遅延静的束縛（公式リファレンス）
http://php.net/manual/ja/language.oop5.late-static-bindings.php

###引数の初期値
PHPでは、引数に初期値を設定することができます。

```default01.php
<?php
function hoge($num = 1)
{
	return $num;
}

$foo = hoge();
//「1」と出力されるはず
echo $foo;

$bar = hoge(2);
//「2」と出力されるはず
echo $bar;
```

引数に初期値が設定されている場合は、その関数を使用するときに引数を設定しなくても問題ありません。つまり、引数が複数の場合以下のように関数を使用することができます。

```default02.php
<?php
function hoge($name, $num = 1)
{
	return $name;
}

$foo = hoge('鈴木');
//正常に動作し「鈴木」と出力されるはず
echo $foo;

$bar = hoge('田中', 2);
//正常に動作し「2」と出力されるはず
echo $bar;

//引数が設定されていないのでエラーになるはず
$hoge = hoge();
```


###引数が異なる同じ名前の関数（オーバーロード）
PHPでは、引数が異なる同じ名前の関数を宣言できません。Javaのようにスマートには書けません。名前を変えて対応しましょう。

```double_declare.php
<?php
class Hoge
{
	public function hoge($hoge_01)
	{
		//...
	}
	
	//同じ関数名では宣言できない
	public function hoge($hoge_01, $hoge_02)
	{
		//...
	}
}
```

####追記（2015.10.29）
PHPで上記をどのように対処するかについて参考になる記事を見つけたので追記しておきます。
[PHPでのオーバーロード（引数ちがいの同名関数）-Qiita](http://qiita.com/yasumodev/items/cf3da2a2f5547358e780)


##インスタンスの生成と関数の呼び出し
```instance.php
<?php
//newの仕方はJavaと同じ
$hoge = new Hoge();
//「.」ではなく「->」と書く
$username = $hoge->get_username();

class Hoge
{
	private $username = 'hogepon';
	private $num;

	//コンストラクタ
	public function __construct()
	{
	}

	public function get_username()
	{
		return $this->username;
	}
	
	//static関数の例
	public static function set_num($num)
	{
		$this->num = $num;
	}
}
```
インスタンスの生成の仕方はJavaと同じです。メソッドを呼ぶときは「.」ではなく「->」と記述します。タイプしにくいですが我慢しましょう。

##定数
###クラス内
```const_01.php
<?php
class Hoge
{
	const HOGE = 123;
	//Javaだとこう↓だったはず
	// puclic static final int HOGE = 123;
}
```
変数名の前に「const」をつけることでクラス内の定数を定義できます。この場合クラス名の前に「$」は不要です。またPHPではプロパティに対して「final」は使用できません。

◇finalキーワード（公式リファレンス）
http://php.net/manual/ja/language.oop5.final.php

###クラス外
```const_02.php
<?php
define('HOGE', 123);

//以下はPHP 5.3.0 以降で動作します
//const HOGE = 123;
```
クラス外では上記のように「define」を使用して定数を定義できます。また、「PHP 5.3.0」以降ではクラス外であっても「const」で定義できるようです（知らなかった）。

◇構文（公式リファレンス）
[http://php.net/manual/ja/language.constants.syntax.php](http://php.net/manual/ja/language.constants.syntax.php)


-
実はもう少し書くことがあったのですが、時間切れになってしまったのでこの記事に追記するか別の記事に回すことにしました。

追記（2015.10.29）
本記事の続き「[その2](http://qiita.com/satopon/items/ce56f44aa8defce7c116)」を書きました。