【メモ：自分用】PHPで学んだことリスト

```index.php
f<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<title></title>
	<link rel="stylesheet" href="">
</head>
<body>

	<?php 
		$number = rand();
		if($number % 2 == 0) {
			echo $number."は偶数です".PHP_EOL;
		} else {
			echo $number."は奇数です".PHP_EOL;
		}

		$var = 1;
		$var_name = 'var';
		echo $$var_name,PHP_EOL;//1 可変変数

		$foo = 1;
		function some_function(){
			global $foo;
			echo $foo.PHP_EOL;
		}
		some_function(); //1
	?>
	<br>
	<br>
	<?php  
		$test = 'test';
		$result = isset($test) ? true : false;
		var_dump($result);
	?>

	<?php 
		$fruits[] = 'apple';
		$fruits[] = 'banana';
		$fruits[] = 'orange';
		var_dump($fruits);//[0]=> string(5) "apple" [1]=> string(6) "banana" [2]=> string(6) "orange"

		// $fruits = 'apple';
		// $fruits[] = 'banana';
		// $fruits[] = 'orange';//Uncaught Error: [] operator not supported for strings

		//要素の参照パターン　変数の値が引き継がれる
		// foreach($fruits as &$color) {
		// 	$color = 'black';
		// }
		// var_dump($fruits);//array(3) { [0]=> string(5) "black" [1]=> string(5) "black" [2]=> &string(5) "black" }
	?>
	<br><br>
	<?php 
		//偶数のみ出力する
		$dice = range(1,6);
		shuffle($dice);
		foreach($dice as $v) {
			if($v % 2 !== 0) {
				continue;
			}
			echo $v."<br>";
		}
	 ?>
	<?php
		//引数のデフォルト値設定　デフォルト値を持つ引数は、デフォルト値をもたない引数よりもあとに定義しなければならない
		function hello($name,$greeting = 'Hello') {
			echo $greeting.' '.$name,PHP_EOL; // ,を忘れない
		}
		hello('Bob','Good Morning');//Good MorningBob
		echo "<br>";
		hello('atsumi');//Hello atsumi
	?>
	<!-- コールバック関数 -->
	<?php
		$array = array(1,1.5,"2",true);
		$new_array = array_map('strval',$array);

		var_dump($new_array);// { [0]=> string(1) "1" [1]=> string(3) "1.5" [2]=> string(1) "2" [3]=> string(1) "1" }
	?>
	<br>
	<!-- 可変関数 -->
	<?php 
		// 引数に与えられた名前を持つ関数が存在すれば、呼び出すための関数
		function func_caller($name) {
			if(function_exists($name)) {
				$name();//可変関数として呼び出し
			}
		}

		function foo() {
			echo 'foo called',PHP_EOL;
		}
		func_caller('foo');//foo called
	?>
	<br><br>
	<!-- call_user_func()　と call_user_func_array() -->
	<?php 
		function add($v1,$v2) {
			return $v1 + $v2;
		}

		class Math {
			public function sub ($v1,$v2) {
				return $v1 - $v2;
			}
			public static function add($v1,$v2) {
				return $v1 + $v2;
			}
		}
		// call_user_func()関数では、コールバック関数の指定につづいて引数を指定
		call_user_func("add",1,2); //3

		//コールバック関数には、無名関数も指定できる
		call_user_func(function($v1,$v2){return $v1 + $v2;},1,2);//3

		//staticメソッドの場合、クラス名を文字列に指定できる
		call_user_func(array('Math','add'),1,2);

		// staticメソッドの場合、【クラス名::メソッド名】という文字列でも指定できる
		call_user_func('Math::add',1,2);

		$array = array(1,2,3,4,5);
		$array_custom = array_map(function($v){return  $v * 2;},$array);
		var_dump($array_custom);//array(5) { [0]=> int(2) [1]=> int(4) [2]=> int(6) [3]=> int(8) [4]=> int(10) }
	?>
	<br><br>
	<!-- 定数済み関数 -->
	<?php 
		// internal　→　組み込み関数・拡張機能によって定義される関数　user 自分でfunctionキーワードを用いて定義した関数
		//var_dump(get_defined_functions());
	 echo 1,2,3,4,5;//12345
	?>
	<!-- クラスとオブジェクト -->
	<?php 
		class Employee {

			public $salary = 20;

			public function word() {
				echo '言語構造を整理します';
			}

			// public final function getSalary() {
			// 	return $this -> salary;
			// }
		}
		$yamada = new Employee();
		echo $yamada -> word();//言語構造を整理します

		//オブジェクトの参照を渡すパターン
		$suzuki = $yamada;

		// オブジェクトの参照を渡すのではなく、複製したい場合
		$suzuki = clone $yamada;
	?>
	
	<?php 
		class Programmer extends Employee {
			public $name;
			public function word() {
				echo 'プログラムを書いています'.PHP_EOL;
			}

			public function getSalary() {
				return $this -> salary * 2;
			}
		}
		$programmerWorker = new Programmer;
		$programmerWorker -> name = 'atsumi' ;
		echo $programmerWorker -> name . $programmerWorker -> word();
	?>

	<br><br>
	<!-- プロパティ = クラス内に保持している変数のこと -->
	<?php  
		class Employee2 {
			public $name;
			public $state = '働いている';
			public static $company = '技評技術社';

			public function word() {
				echo '書類を整理しています'.PHP_EOL;
			}
		}
		$yamada = new Employee2();
		$yamada -> name = '山田';
		$atsumi = $yamada;
		echo $yamada ->state.$yamada->name."さん";//働いている山田さん
		echo $atsumi ->state.$atsumi->name."さん";//働いている山田さん →　参照による引き渡しをしているから
		$atsumi -> name ='渥美';
		echo $atsumi ->state.$atsumi->name."さん";//働いている渥美さん →　参照による引き渡しをしているから
		echo '従業員はみんな'.Employee2::$company.'に勤めています';//従業員はみんな技評技術社に勤めています
	?>
	<br><br>
	<!-- 
		$this 
		オブジェクトのインスタンス化を行うと、クラスのメソッドで利用できる$thisが自動的に定義される
		$thisは自分自身のオブジェクトの参照を表す。
	-->
	<!-- staticメソッド 
		インスタンス化されていなくても外部から直接呼び出すことができる
	-->
	<?php 
		class Employee3 {
			public static $company = '技評技術社';

			public static function getCompany() {
				return self::$company;
			}

			public static function setCompany($value) {
				self::$company = $value;
			}
		}
		echo Employee3::getCompany().PHP_EOL;//技評技術社
		Employee3::setCompany('技術評論社');
		echo Employee3::getCompany().PHP_EOL;//技術評論社
	?>
	<!-- コンストラクタとデストラクタ 
		コンストラクタはオブジェクトを生成するうえで必要なパラメーターや、そのクラスのオプションなどを引数と受取、プロパティにセットするなどという役割を果たします・

	-->
	<?php 
		class Employee4 {
			const PARTTIME = 0x01;//アルバイト
			const REGULAR = 0x02;//正社員
			const CONTRACT = 0x03;//契約社員

			private $name; //名前を保存するプロパティ
			private $type; //雇用形態を保存するプロパティ

			public function __construct($name,$type) {
				$this -> name = $name;
				$this -> type = $type;
			}
		}
	?>
	<!-- インターフェイス 
		インターフェイスとは、複数の異なるクラスに共通の機能を実装するために、その実態を定義することなく指定する仕組み
		インターフェイスを用いると、特定のオブジェクトが特定の機能(メソッド)を有することが保証される
		※インターフェイスのメソッドはpublicでなければならない
	-->
	<?php 
		interface Reader {
			public function read();
		}
		interface Writer {
			public function write($value);
		}

		class Configure implements Reader,Writer {
			public function write($value) {
				// 書き込みの処理
			}
			public function read(){
				// 読み込みの処理
			}
		}
	?>

	<!-- クラスとオブジェクトの機能と特徴 -->
	<?php 
		class Employee5 {
			public function __toString() {
				return 'This Class is '.__CLASS__;
			}
		}
		$yamada = new Employee5();
		echo $yamada;//This Class is Employee5
	?>
	<br><br>
	<!-- 例外処置 -->
	<?php 
		function div ($v1,$v2) {
			if($v2 === 0) {
				throw new Exception("第二引数が0になっています");
			}
			return $v1 / $v2;
		}

		try {
			echo div(1,2);
			echo div(1,0);
			echo div(2,1);
		} catch (Exception $e) {
			echo 'Exception!'.PHP_EOL;
			echo $e -> getMessage().PHP_EOL;
		}
	?>
</body>
</html>

```