PHP(二日目)

 

function sayHi($name) {
$lang = "php";                                                                   - 変数にphpを代入
echo "hi! $name from $lang";
}

sayHi("Tom");
var_dump($lang);

$x = 5.6;
//echo ceil($x); //6                                                           - 小数点以下切り上げ
//echo floor($x); //5                                                         - 小数点以下切り捨て
//echo round($x); //6                                                       - 四捨五入
//echo rand(1,10);                                                           - 1-10の値をランダムに表示

$s1 = "hello";
$s2 = "ねこ";
//echo strlen($s1); //5                                                     - 桁数
//echo mb_strlen($s2); //2                                              - マルチバイト型の文字数
//printf("%s - %s - %.3f", $s1 , $s2 , $x);                        - データ型を指定して表示する

$colors = ["red" , "blue" , "pink"];
echo count($colors);                                                      - 配列の数を取得する
echo implode("@",$colors);                                           - 指定した文字で配列の情報を区切って表示する

★クラス・インスタンス
・User
・アクセス権
 ・private :そのクラス内からのみアクセス可能
 ・protected :そのクラス+親子クラスからアクセス可能
 ・public :すべてのクラスからアクセス可能

class User {                                                                   - Userクラスの設定
//property
//public $name;
//protected $name;
private $name;

//constructor
public function __construct($name) {
$this->name = $name;
}

//method
/final/ public function sayHi() {                                      - fainalを使用すると最終クラスになる
echo "hi! i am $this->name!";
}
}
class AdminUser extends User {                                 - Userをエクステンドした子クラス(親クラスの関数を使用できる)
public function sayHello() {
echo "hello from Admin!";
}
//override                                                                     - オーバーライドで、親クラスの関数を上書きできる
public function sayHi() {
echo " [admin]hi! i am $this->name!";
}

}

$tom = new User("Tom");                                            - newでUserクラスのインスタンスを登録
$bob = new User("Bob");

echo $tom->name;                                                      - Userクラスのmethodが使用可能
$bob->sayHi();

抽象クラス
abstract class BaseUser {                                            - abstract class クラス名で抽象クラスを作成する
public $name;
abstract public function sayHi();
}

class User extends BaseUser {
public function sayHi() {                                              - 子クラスは必ず抽象クラスのMethodを使わなければならない
echo "hello from User!";
}
}

interface                                                                  - 子クラスにて使用されるインターフェースを定義する
・例
interface sayHi{
public function sayHi();                                              - interfaceのアクセス権はpublicにする
}

interface sayHello{
public function sayHello();
}

class User impriments sayHi,sayhello {                    - extendsではなくimplementsを使用する(親クラスを複数設定できる)
public function sayHi(){
echo "hi!";
}
public function sayHello() {
echo "Hello!";
}
}


外部ファイルからのデータ利用
[外部ファイル]
<?php

class User {                                                              - ユーザー定義のファイル
public $name;
public function __construct($name) {
$this->name = $name;
}
public function sayHi() {
echo "hi , i am $this->name!";
}
}
[メインファイル]
<?php

//require: fatal error                                                 - fatal errorを吐き出し処理を終了する
//require_once

//require "User.class.php";

//include: worning                                                   - worningを吐き出し処理を続行する
//include_once

//autoload                                                                - クラス名が決まっていない場合使用する

spl_autoload_register(function($class) {
require $class . ".class.php";                                  - 指定したuserクラス+.class.phpでファイルを指定する
});

$bob = new User("Bob");

$bob->sayHi();

 

名前空間
[外部ファイル]
<?php

namespace Dotinstall\Lib;                                      - 名前空間の指定(階層構造で記載する)

class User {                                                            - ユーザー定義のファイル
public $name;
public function __construct($name) {
$this->name = $name;
}
public function sayHi() {
echo "hi , i am $this->name!";
}
}
[メインファイル]
<?php

//名前空間

require "User.class.php";
//use Dotinstall\Lib as Lib;                                      - use 名前空間 as 定義する文字列
use Dotinstall\Lib;                                                  - 定義する文字列を書かない場合は最終階層の文字列になる

$bob = new Lib\User("Bob");                                 - クラス名の前に名前空間の階層構造を記載する

$bob->sayHi();

 

例外処理

//function div($a,$b) {
// echo $a / $b ;
//}

function div($a,$b){
try{
if($b === 0) { - $b = 0の場合
throw new Exception("cannnot divide by 0!");        - 文字列を投げる
}
echo $a / $b;
} catch (Exception $e) { - Exeptionが投げられたら
echo $e->getMessage();                                        - getMessageで取得した文字列を表示する
}
}

div(7,2);
div(5,0);

フォームからのデータ処理
<?php

$username = ''; - の初期設定
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$username = $_POST['username'];                     - ユーザ名を取得する
$err = false;
if (strlen($username) > 8) {                                  - ユーザ名が8文字以上の場合
$err = true;
}
}

?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>Check username</title>
</head>
<body>
<form action="" method="POST">
<input type="text" name="username" placeholder="user name" value="<?php echo
htmlspecialchars($username, ENT_QUOTES, 'UTF-8'); ?> ">   - ユーザ名の取得
<input type="submit" value="Check!">
<?php if ($err) {echo "Too long!"; } ?>                                          - ユーザ名が8文字以上の場合表示する
</form>
</body>
</html>

クッキー                                                                                - データをブラウザ内に保存する
 ・ブラウザに保存するので、ほかのプログラムからも取得可能
setcookie("username" , "suzuki");                                         - usernameにsuzukiという値をセットする
setcookie("username" , "suzuki" , time()+60*60);                 - 有効期限はtimeで設定する
setcookie("username" , "suzuki" , time()-60*60);                  - 有効期限を過去時間にするとcookieの削除

echo $_COOKIE['username'];

セッション                                                                            - データをサーバー内に保存する
・以下のような利点がある
 ・大きなデータ
 ・改ざんされない
 ・中身が見られない

session_start();                                                                     - session開始時の定義

//$_SESSION['username'] = "suzuki";
//echo $_SESSION['username'];

unset($_SESSION[username]);                                           - session終了の定義
echo $_SESSION('username');

PHP(一日目)

 

ビルトインサーバー
php -S IPアドレス:ポート番号 - ローカル開発環境で仮サーバーを立てる
 ・Ctrl+Cで終了
 ・エラーはターミナルで確認できる

変数とデータ型
・文字列:string
・数値:integer float
・論理値:boolean (true/false)
・配列
・オブジェクト
・null

・$xxxxx = ??????? - 変数$xxxxxに??????を代入する
 ・データ型を宣言する必要はなし

定数
・define("定数名(全角)","定数に代入する文字列"); - 定数を定義する
・var_dump(__LINE__); - 行数表示
・var_dump(__FILE__); - ファイル名表示
・var_dump(__DIR__); - ディレクトリ表示

数値型の演算
+ - * / % ** - 四則演算

単項演算子
++ -- - 1ずつ増減

代入を伴う演算子
$x *= 2; - $x = $x * 2と同様の計算

文字列
・"" - 特殊文字(\n, \t) 変数
・''

連結 .
$s = "hello " . "world"; - .の前後をつなげて表示する

if 条件分岐
・比較演算子 > < >= <= == === != !==
・論理演算子 and && , or || ,!

・例
if (条件式) {
trueの場合;
} elseif (条件式) {
trueの場合;
} else {
それ以外
}

真偽値
・falseになる場合
文字列:空 , "0"
数値:0 , 0.0
論理値:false
配列:要素の数が0
null

$x = 5;
if ($x) { - if ($x == true) {と同じ
echo "great!";
}

三項演算子
$max = ($a > $b) ? $a : $b; - ()の条件式が真の場合:左、偽の場合:右

if ($a > $b) {
$max = $a;
} else {
$max = &b;
}と同じ

ループ処理
・while - 前判定(結果が偽の場合処理されずに抜ける)
・do ... while - 後判定(結果が偽の場合でも一度処理をしてから抜ける)
・例
$i = 0;
while ( $i < 10) {
echo $i;
$i++;
}

do {
echo $i;
$i++;
} while ($i < 10) ;

・for
・break - ループを抜ける
・continue - それ以降の処理を実行せずに次のループに移る
・例
for ( $i = 0; $i < 10; $i++) {
if ($i == 5) {
//break; - $iが5の場合ループを抜ける:1234
continue; - $iが5の場合処理をせずに次の処理へ:13467889
}
echo $i;
}

配列
・key value
・例
$sales = array(
"suzuki" => 200,
"fkoji" => 800,
"dotinstall" => 600,
);

※PHP5.4以降 - array省略可能
・例2
$sales = [
"suzuki" => 200,
"fkoji" => 800,
"dotinstall" => 600,
];

var_dump($sales["fkoji"]); //800 - 変数配列["key"];
$sales["fkoji"] = 900; - 変数の内容の変更
var_dump($sales["fkoji"]); //900

・例3
$colors = ["red" , "blue" , "pink"];
var_dump($colors[1]); - keyを指定しない場合0~の連番が振られる

・foreach
・例
$sales = array(
"suzuki" => 200,
"fkoji" => 800,
"dotinstall" => 600,
);

foreach ($sals as $key => $value){ - 配列の内容をループ処理で取り出す
echo "($key) $value ";
}

$colors = ["red" , "blue" , "pink"];
var_dump($colors[1]); //blue

foreach ($colors as $value){
echo "$value ";
}

//コロン構文 - {}を: endforeachで表記できる
foreach ($colors as $value): ・HTMLに組み込む際に見やすくなる
echo "$value "; ・for , whileにも使用可能
endforeach;

関数
・function xxxx(); - xxxx()という関数を登録する
・例
function sayHi($name = "susuzki") { - 引数の初期値を設定する
//echo "hi!.$name ";
return "hi!" .$name ;
}

//sayHi(); - 引数を指定する
//sayHi("Tom");
//sayHi("Bob");
//sayHi();

$s = sayHi(); - 戻り値を返す
var_dump($s);

 

GIT

ドットインストール準拠

 

・git                                         - バージョン管理システム
・作業ディレクトリ                - ファイルを作成、修正する
・ステージングエリア             - 作業途中の場所
リポジトリ                           - 途中経過を保存する場所

gitを使用する際の設定
・必ず設定する
 ・git config --global user.name "ユーザ名"                - ユーザ名を定義する
 ・git config --global user.email "メールアドレス"      - Emailアドレスを定義する
・got config --global color.ui true                                   - uiを色別に表記する機能
・git config -l                                                                  - gitの設定を表示する
・git donfig --help or git help config                                - ヘルプの表示

コミット
・git init ファイル名             - 現在のディレクトリをgitで使用するという定義を行うコマンド
・git add ファイル名            - ファイルを作業ディレクトリからステージングエリアに保存する
・git commit ファイル名      - ファイルをステージングエリアからリポジトリに保存する
・git log                                - gitのログを表示する
・git log --oneline                 - gitのログを一行で表記する
・git log -p                            - 変更点を表記したログ(変更されたファイル、行数、内容など)
・git log --stat                       - 変更されたファイル、行数を表記したログ

現在の状態の把握
・git status                                - ファイルの現在の状態の出力(modifiedと表示されていたら変更されている状態)
・git checkout -- ファイル名     - 変更を保存せず元の状態に戻す

差分の確認
・git diff                           - 差分の表示(ステージングエリアにあげる前のファイルが対象)
・git diff --cached            - 差分の表示(ステージングエリアにあるファイルが対象)

ファイル操作
・git add .                       - 以下のファイルを同時にステージングエリアに保存する
・git rm / git mv               - ギット管理しているファイルは削除、移動にgitコマンドを使用する

git管理を含めないファイル
・.gitignore                                 - git管理しないファイルを指定するファイル
 ・*.log                                     - *.logを含むファイルはgit管理しないという指定
 ・gitignoreファイルを置いた階層とそれ以下の階層に対して指定する

直前のコミットを変更する
・git commit -m "メッセージ"                - メッセージを少ししか記載しない場合
・git commit --amend                            - 直前のコミットを変更する(大した変更を行わなかった場合)

過去のバージョンに戻る
・git reset --hard HEAD                               - 直前のコミットに変更する
・git reset --hard HEAD^                             - 二つ前のコミットに変更する
・git reset --hard コミットID                       - 指定したIDのコミットに変更する
・git reset --hard ORIG_HEAD                    - 過去バージョンに戻る前に変更する(直前のコミットに戻る)

ブランチ
・git branch                                                  - 現在の作業ブランチを確認する
 ・互いに干渉しないため、複数のバージョンを同時に編集するときに便利
・git branch ブランチ名                               - 新規ブランチを作成
・git checkout ブランチ名                            - 指定した作業ブランチをアクティブにする
・git merge ブランチ名                                - 現在の作業ブランチに指定ブランチを反映する
・git branch -d ブランチ名                           - 指定したブランチを削除する
・git checkout -b ブランチ名                        - ブランチを作成してアクティブにす

・コンフリクト                                             - 異なるブランチで同じ部分を編集し、マージする際の衝突
・vi ファイル名
  ・<<<<<<HEAD       - ここから
           line 1st          |
   =========        |
   line first       |
   >>>>>>hogehoge                              - ここまでに相違がある
 ・コンフリクトの修正は残したほうを残して削除編集すればよい

タグ
・git tag                                     - タグの一覧を見る
・git tag タグ名                         - 現在のコミットに指定したタグをつける
・git tag タグ名 コミットID      - 指定したコミットに指定したタグをつける
・git tag -d タグ名                     - 指定したタグを削除する

エイリアス
・git config --global alias.co checkout           - co=vheckoutと指定する
・git config --global alias.st status                 - st=statusと指定する
・git config --glibal alias.br branch                - br=branchと指定する
・git config --global alias.ci commit               - ci=commitと指定する
・git config -l - gitの設定を見る(エイリアスのリストの表示)

共有リポジトリ                             - 共同開発する際の共有のリポジトリ
・git init --bare                                                           - 当階層では変更を行わない、共有のためのgitを設定
・git remote add 名前 共有リポジトリのパス           - 共有リポジトリの場所を設定
 ・git remote rm 名前                                              - 共有リポジトリ設定を削除
・git push origin master                                             - マスターの内容を共有リポジトリにpushする
・git clone 共有リポジトリのパス フォルダ名          - 共有リポジトリの内容のフォルダを作成する
・git pull origin master                                                - 共有リポジトリの内容をマスターにpullする
・A,B共にpushした場合、先にpullを行えというエラーが発生する
 →git pull origin master
 ・同ファイルを変更しようとしていた場合はコンフリクトが発生するため、上記同様修正する

UNIXコマンド

※ドットインストール準拠

 

ファイル操作
pwd ― 現在のディレクトリを表示する
 パスの表記は二種類 ― 相対指定(cd unix_lessons等現在の位置から相対的にディレクトリを示す)
― 絶対指定(/home/vagrant/unix_lessons等一つのディレクトリを絶対的に指定する)
・cd (チェンジディレクトリ) ― フォルダの階層移動を行う
・clear / Ctrl+L ― 表示されているコマンドを消す
・cd .. ― ひとつ上の階層へ移動する
・cd - ― 直前の階層へ移動する
・cd ― homeディレクトリへ移動する
・mkdir ― ディレクトリ作成
・ls ― 現階層のリストを表示する
・mkdir -p ― ディレクトリ作成の際、親ディレクトリが存在しない場合は同時に作成する
・mv ― ファイル移動を行う
・rmdir ― ディレクトリの削除(中身が存在する場合エラー)
・rm -r ― ディレクトリの削除を再帰的に行う(中身が存在する場合すべて削除)
・cat ― ファイル内容を表示する
・less ― ファイル内容を表示する(内容が長い場合)
・cp ― ファイルのコピー
・mv ― ファイルの移動(同階層に移動する場合、ファイル名の変更)
・rm ― ファイルの削除

bushの便利機能
・タブ補完
 ・最低限の入力後タブキーで補完入力される
 ・候補が複数存在する場合はタブキー連打で次候補へ
 ・タブキー二回押下で候補の表示
・Ctrl+C ― 現在実行しているコマンドを終了する
・矢印上キーで直前に使用したコマンドを順番に表示する
・Ctrl+R ― コマンドの検索(myaの入力で直前に実行したcd myappが呼び出される)
 ・再度Ctrl+Rで次候補
 ・終了する場合はEscもしくはCtrl+C

コマンド履歴の活用
history ― 実行したコマンドの履歴を表示する
・!履歴番号 ― historyで表示した履歴番号と同じものを実行
・!! ― 直前に実行したコマンドを実行する
・!-2 ― 後ろの数字分前のコマンドを実行する
・!$ ― 直前のコマンドの引数で実行する
・!pw ― 直前に実行したpwから始まるコマンドを実行する
 ・!pw:p ― 最後に:pをつけることで実行せずにコマンドを表示する

コマンドについて調べる
・--help ― コマンドの後につけることによって、コマンドのヘルプを見る
・man ― コマンドの前につけることでヘルプより詳しいマニュアルを見る
 ・内部的にはlessが実行しているため、スペースで次ページたEscで終了ができる
 ・/検索文字列 ― less内で検索を実行する
  ・文字列検索中nで次検索文字列、Shift+Nで前検索文字列
  ・man終了はqキー

VIM
・vi ファイル名 ― 実行時はコマンドモードでファイルを開く
 ・i ― インサートモード、ファイルの編集を実行する
 ・:w ― 編集を保存する
 ・:q ― vimを終了する
 ・:q! ― 編集を保存しないで終了する

シンボリックリンク
・ln -s ― ln -s パス 代替名でパスを代替名で指示することができる
・ls -l ― リンクの詳細を表示する
・unlink ― シンボリックリンクを削除する

ユーザ、グループの確認
・etc/passwd ― (cat)ユーザ情報の表示
・etc/group ― (cat)グループ情報の表示
・groups ― 自分が所属しているグループを表示する

パーミッション
-rwxrw-r--. 1 root root 22 4月 3 01:16 2018 index.php
・最初の文字列は三文字ずつに振り分けられる
 ・rwx ― ユーザの権限
 ・rw- ― グループの権限
 ・r-- ― その他の権限
  ・r ― 書き込み可
  ・w ― 読み取り可
  ・x     ― 実行可
・chmod ― 権限の付与、削除を実行するコマンド
 ・chmod g+x index.php ― グループに対して実行権限を付与する
 ・chmod go+x index.php ― グループとその他に対して実行権限を付与する
 ・chmod a-x index.php ― すべてに対して実行権限を削除する
・最初の文字列を数字で表記する方法
 ・r ― 二の二乗で4
・w ― 二の一乗で2
 ・x ― 二の零乗で1
  ・rwx ― 4+2+1で7
  ・rw- ― 4+2+0で6
  ・r-- ― 4+0+0で4
・chmod
 ・chmod 774 index.php ― rwxrwxr--(グループに書き込み権限を付与する)
 ・chmod 664 index.php ― rw-rw-r--(ユーザの実行権限を削除する)

コマンドの作成
・type コマンド名 ― コマンドが存在するか確認する
・vi コマンド名 ― vimでコマンドを作成する

・コマンドを実行するにはパスを指定しないといけない
 ・echo $PATH ― コマンドをどこから検索しているかを見る
 ・printenv ― すべての環境変数を見る
 ・export ― 環境変数を変更する
  ・export PATH=/home/vagrant/unix_lessons/muapp:$PATH ― 現在設定しているパスの先頭に新しく追加する
  ・which コマンド名 ― 実行しようとしているコマンドがどこから呼び出されているか

管理ユーザになる
・su -l(su -) ― 管理ユーザとしてログインする(パスワードの入力)
・sudo ― このコマンドを管理者として実行するコマンド(sudoを可能にする設定必要)

ユーザを変更する
・chown vagrant:vagrant messages ― messagesのユーザ、グループをrootからvagrantに変更する

テキストを操作するコマンド
・wc ― 行数、単語数、バイト数、ファイル名を表示
 ・wc -l ― 行数、ファイル名を表示
・head ― テキストの先頭から10行(デフォルト)表示する
 ・head -3 ― テキストの先頭から3行表示する
・tail ― テキストの末尾から10行表示する
 ・tail -3 ― テキストの末尾から3行表示する
grep "文字列" ― 文字列が含まれた行を表示する

リダイレクション、パイプ
・echo "date" > ファイル名 ― echo "date"で実行した結果をファイルに書き込む
・echo "free" >> ファイル名 ― echo "free"で実行した結果をファイルの末尾に書き込む
bash < cmd.txt ― ファイルの内容を取り込ませる(dateもfreeもbushコマンド)
・bush < cmd.txt > result.txt ― 実行結果をresult.txtにリダイレクションする
・ls -l /etc | grep "php" ― etcフォルダの中のphpを含むファイルのみリストする
・ls -l /etc | grep "php" | wc -l ― etcフォルダの中のphpを含むファイルのリストの行数を表示する

ワイルドカード
・* ― 複数文字を表すワイルドカード
・? ― 1文字を表すワイルドカード

検索
・find 対象フォルダ -name "検索文字列" ― 検索文字列を含むファイルを対象フォルダから検索する
・find 対象フォルダ -name "検索文字列" -type f ― 検索文字列を含むファイルを対象フォルダから検索する(ファイルタイプのみ)
・find 対象フォルダ -name "検索文字列" -type f -exec wc -l {} + - find実行結果を{}内に入れてコマンドを実行する
・find 対象フォルダ -name "検索文字列" -type f | xargs wc -l - find実行結果を後ろの子コマンドにパイプする

バッシュ展開
・{} - {}内を展開して実行する
 ・echo {a,b,c} - 実行結果はa b c
 ・echo {1..10} - 実行結果は1 2 3 4 5 6 7 8 9 10
 ・echo {1..10}{a..g} - 実行結果は1a 1b 1c 1d 1e 1f 1g 2a 2b …
・&& - 前後のコマンドを同時に実行する

Unixコマンドの勉強を行っていたが、開発環境の構築を先に行ったほうが良さそうなので、先にそちらをドットインストールを用いて実装することに。

 

ソフトのインストールを行い、PowerShellで実行しようとするとエラー…

補足欄に同内容のエラーがなく、調べてみるとPowerShellのバージョンが最新でないようなので、アップデート。実行に成功し、Vagrantファイルの作成まで完了。

 

次に仮想でVagrantサーバーを立て、Puttyを使用し接続しようとするがここでまたタイムアウトエラー…

vagrant status コマンドでステータスを見てみるが、runningと表示されている。

IPアドレスvagrant reloadを試してみるが、かわりなし。

pingをサーバ側に送信すると要求がタイムアウトされる。一度サーバを落とし、再度vagrant upで実行するが、変わりなし。

調べてみると、BIOSの設定で、仮想化が無効になっている記事と同様のエラーを吐いていたので、BIOSの設定を見に行く。設定は案の定無効になってたので、有効に変更。

同様の手順を踏み、Puttyから仮想サーバにアクセスすることができた。

そこからは、サーバの停止まで問題なく実行できた。