2017/05/14

PHP基礎文法最速マスター(随時更新)

仕事柄PHPを触る事になったので、コーディングルールをまとめてみました。

PHPの特徴

  • =Php Hypertext Processing
  • Web開発に特化したサーバーサイドの言語
  • 比較的環境構築が容易(LAMP等)、開発者が多く日本語ドキュメント・ナレッジも多いので初学者向き。
  • 標準ライブラリが充実、下位互換サポートが手厚い
  • インタプリタ型言語なのでコンパイル不要
    • 実際は実行時に内部的にオペコードと呼ばれる中間コードにコンパイルをしてから実行される。
    • PHPはC言語で記述されている。
  • WikipediaやFacebook等、大手でも利用実績あり

コーディング規約

最低限PSR1,PSR-2,PSR-4を抑える
他に各フレームワーク毎の規約もあるので指定があれば都度習得する。

  • PHPコーディング規約まとめ
    • http://qiita.com/hshimo/items/04be1f432240c58300f4
  • PSR-1 と PSR-2 を5分でざっくり理解する
    • https://www.slideshare.net/wterada/psr1-psr2-5
  • PSR1 基本コーディング規約
    • http://www.infiniteloop.co.jp/docs/psr/psr-1-basic-coding-standard.html
  • PSR2 コーディングスタイル
    • http://www.infiniteloop.co.jp/docs/psr/psr-2-coding-style-guide.html

ファイル

  • ファイル拡張子は「.php」
  • エンコーディングはUTF-8N(BOM無しUTF-8)
  • 文末に必ずセミコロン(;)をつける。
  • PHPタグ
    • 開始タグ<?php で始める。
    • HTMLを書く場合だけ、PHP記述の最後に終了タグ ?>を記述して、次行からHTMLコードを書く。
    • 上記以外の場合は終了タグ ?>を記述してはいけない。弊害が多い。
  • ファイル末尾は改行で終わる。
  • 1ファイル、1クラス
  • トップレベルの名前空間を定義する

インデント

  • スペース4つ分、タブは使用しない(環境によりタブ幅が異なるため)

コメント

// 単一行コメント
/* ここから
   複数行は
  コメントアウト */

予約語

  • 小文字で記述する(true,false,null等)

データ型

  • 文字列(String)
  • 整数(Integer)
  • 浮動小数点(Float)
  • 配列(Array)
    • 配列 array(“A”,”B”,”C”);
    • 連想配列 array(“名前”=>”チョコレート”,”種類”=”食品”);
  • 真偽値(Boolean)
  • オブジェクト
  • リソース
  • null

定数

// 定数名はUPPER_SNAKE_CASE
// 定義は原則constを使う。
// ただし場合によりdefineを使い分ける。
// http://qiita.com/Hiraku/items/bb0cb665d830f7cd37ff
const SAMPLE_CONSTANT = 10;
define("PI","3.14");

変数

// 先頭$のlower_snake_case
$sample_variable = 5;

// 文字列内の変数は$変数名で表現
echo "値は$sample_variableです"

定義済み変数

全スコープで使用できる定義済みの定数
例)$_SERVER, $_POST, $_GET, $GLOBALS, $_ENV, $_COOKIE, $argc, $argv等

  • 定義済み変数一覧
    • http://php.net/manual/ja/reserved.variables.php

名前空間

  • namespaceの後に空行を1行空ける。
  • use宣言は1つずつ行う。
  • use宣言ブロックの後に空行を1行空ける
<?php
namespace Vendor\Model;

use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackages\BazClass;

// ....additional PHP Code

クラス、メソッド名

// クラス名はUpperCamelCase
// メソッド名はlower_snake_case
class SampleClass
{
    function sample_method
    {
        // sample body
    }
}

出力

echo("hoge")      #Rubyで言うprint "hoge"
echo("hoge\n"     #Rubyで言うputs "hoge"
var_dump("hoge")  #Rubyで言う p "hoge"

演算子

### 代入演算子
$calc += 1   #$calc = $calc + 1;
$calc -= 1   #$calc = $calc - 1;
$calc \*= 1  #$calc = $calc * 1;
$calc /= 1   #$calc = $calc / 1;


### 比較演算子
// 値の一致
if ($string == "test")
{
    ...
}
// 値と型の一致
if ($string === "test")
{
    ...
}

### インクリメント(加算子)、デクリメント(減算子)
$number++、++$number
$number--、--$number

制御構造

if,elseif,else

<?php
if ($expr1) {
    //if body
} elseif ($expr2) {
    //elseif body
} else{
    //else body;
}

文字列

Stringライブラリ一覧 http://php.net/manual/ja/book.strings.php

// 結合
"ketsugou"."dekita";
# -->'ketsugoudekita'

// 分割(split)
split("," , "bunkatu, dekita?");
# -->array( 0=> 'bunkatsu',1=>'dekita?')

// 文字の長さ(strlen)
strlen("mojinonagasa-ha?");
# -->16

// 検索(文字列内に特定文字列を含む場合の開始位置)
strpos("abcd","bc");
# -->1

// 文字一部切出し(substr)
substr("abcd",0,2);
# -->ab

// 配列の各要素の値で特定キーと一致するものがあれば置換
str_replace('abcde','12345',$str)
strtr('abcde','12345',$str)

// エスケープ処理
htmlspecialchars($string,ENT_QUOTES,'UTF-8');

配列

PHPは連想配列しかもたない。配列はキーが数値の連想配列という扱い。

  • $array1 = array(1,2,3) //キーが0から始まる数値の連想配列
  • $array2 = array(“a”=>1,”b”=>2,”c”=>3); Ruby,PHPの配列操作比較まとめ
  • http://aligach.net/diary/20050829.html
// 文字列オブジェクトの作成
$ary = array("a","bb","ccc","dddd");
$ary = ["a","bb","ccc","dddd"];

// 配列要素の個数
count($array1);

// 先頭要素取り出し
array_shift($array1);

// 先頭要素に追加
array_unshift($array1,5);

// 末尾を取り出し
array_pop($array1);

// 末尾に追加
array_push($array1,9);

// keyの取得
array_keys($array1);

// valueの取得
array_values($array1);

// keyの存在確認
array_key_exists('key',$array1);   #true or falseが返る

// 複数個の配列の結合
array_merge($ary1,$ary2);

// 配列を逆順にする
array_reverse($ary)

// 対象が配列か確認
is_array($array1);

// 対象が空か確認
empty($ary);

// 配列要素の出現回数を出力
array_count_values($ary);
empty($ary);

// 配列の各要素の値の中に、特定文字列と完全一致するものが含まれるか判定  #true or false
in_array(abc,$array1);
※Rubyでいうary.include?

// 配列の各要素に指定した関数操作を行う。
function toDouble($value){ return $value\*2 };
array_map(toDouble,$args);

ファイル操作

// 対話入力を受け付ける
fgets(STDIN)

// 外部ファイル読み込み(読み込み失敗時にエラーで停止)
require('./test.php');
require_once('./test.php');  #ファイルを1度だけ読み込む

// 外部ファイル読み込み(読み込み失敗時にエラーは出るが続行)
include('./test.php');
include_once('./test.php); #ファイルを1度だけ読み込む

日本語対応

//カナを"全角かな","半角かな"等に変換
http://php.net/manual/ja/function.mb-convert-kana.php
mb_convert_kana($str,"KVC"); //全角かな
mb_convert_kana($str,"KVa"); //半角カタカナ-->全角カタカナ & 全角英数字-->半角

現行PHP環境の設定一覧

  • php -i
  • php -r ‘phpinfo();’

対話型実行環境

  • php -a
  • boris
    • http://goo.gl/hcl98I
      • composerインストール
      • composer require ‘d11wtq/boris’

フレームワーク

  • Laravel(学習コスト低い、普及率急上昇中、遅い)
  • CakePHP(MVCに忠実、普及率高い、学習コスト高い)
  • CodeIgnitor(軽量で規約がゆるい)
  • Symphony
  • Zend Framework

ライブラリ管理

複数ライブラリを互換性を保ちながら導入・管理するための仕組み。
Rubyで言うBundler、Node.jsで言うnpm、Javaで言うMaven、Gradle等

  • Composer
  • PEAR(非推奨)

DB接続

mysql接続用のapiが2種類

  • mysqli
  • pdo 以下は良いまとめ
    http://qiita.com/mpyw/items/b00b72c5c95aac573b71

パフォーマンス

  • apacheなら該当PHPバージョンのrepoからapcu,opcacheを入れる。うまくハマれば数倍のパフォーマンスが出せる。

セッション管理

  • session_start()で開始
  • セッションデータ保存先はphp.iniのsession.save_pathで管理、デフォルトは/var/lib/php/session。保管先ディレクトリの権限を要確認

PHPの歴史

  • http://php.net/manual/ja/history.php.php

PHP7になっての変更点

  • PHP5.6からPHP6を通り越してPHP7となった。
  • 型を厳格に扱えるようになった。

参考

  • PHP The Right Way(基礎まとめ)
    • http://ja.phptherightway.com/
  • PHP基礎文法最速マスター
    • http://goo.gl/2UfW
  • PHPコーディング規約まとめ
    • PSR-1
      • http://www.infiniteloop.co.jp/docs/psr/psr-1-basic-coding-standard.html
    • http://goo.gl/2UfW
  • PHPマニュアル
    • http://php.net/manual/ja/index.php
    • 組み込み関数
      • http://php.net/manual/ja/funcref.php
  • PHPによるデザインパターン入門
    • http://d.hatena.ne.jp/shimooka/20141211/1418298136