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つ分、タブ(\t)は使用しない(環境によりタブ幅が異なるため)

データ型

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

コメント

// 一行コメント


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

予約語

  • 小文字で記述する(true,false,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です"

// グローバルに定義した変数はすべて以下で参照可能
echo $GLOBAL[sample_variable];

定義済み変数

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

  • 定義済み変数一覧
    • http://php.net/manual/ja/reserved.variables.php
  • 各変数の詳しい内容は以下スクリプトを作成してブラウザアクセス等してみると良い。
<?php
echo "<pre>";
print_r($_SERVER);
echo "</pre>";

クラス、メソッド

//クラス名はUpperCamelCase
// メソッド名はlower_snake_case
//プロパティ、メソッドは必ずアクセス権(public/protected/private)のいずれかの指定が必要、デフォルトはpublic

class RobotClass
{
    //プロパティ(アクセス権の明示が必要)
    public $name;
    private  $serial;

    //メソッド
    public function get_serial()
    {
        return $this->serial;
    }

    public function set_serial($serial)
    {
        $this->serial = $serial;
    }
}

//インスタンスの生成
$robo1 = new RobotClass();

//インスタンスのプロパティの参照(privateなプロパティは参照不可)
echo $robo1->name;

//インスタンスのメソッドの参照
$robo1->set_serial("9999-9999-9999-9999")
echo $robo1->get_serial();

//クラスの持つプロパティ、メソッドの一覧情報
echo "<pre>";
var_dump(get_class_vars("RobotClass"));
var_dump(get_class_methods("RobotClass"));
echo "</pre>";



### 名前空間
- namespaceの後に空行を1行空ける。
- use宣言は1つずつ行う。
- use宣言ブロックの後に空行を1行空ける

<?php namespace Vendor\Model;

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

// ….additional PHP Code



### 出力

echo(“hoge”) #Rubyで言うprint “hoge” echo(“hoge\n” #Rubyで言うputs “hoge” var_dump(“hoge”) #Rubyで言う p “hoge” print_r($samplearray)


### 演算子

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

$str = “Hello” $str .= “, World” echo $str = “Hello, World”

// 比較演算子 //// 値の一致 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; }


### 例外

<?php

try{ //try body } catch (FirstExceptionType $e){ //catch body } catch (OtherExceptionType $e){ //catch 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);

//gzip圧縮された文字列を生成 http://php.net/manual/ja/function.gzencode.php gzencode($data,9)

// 配列の各要素の値の中に、特定文字列と完全一致するものが含まれるか判定 #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.iniで決定する。
    $ php -i | grep session.save_path
    no valueの場合はデフォルトで/var/lib/php/session
  • セッションの有効時間は以下 http://pentan.info/php/session_gc.html
    • まずはGC(セッションのお掃除)を必ず発生させるように設定
      • session.gc_divisor => 1
      • session.gc_probability => 1
    • 破棄間隔を設定
      • session.gc_maxlifetime

現行PHP環境設定ファイルの場所確認

  • php –ini

現行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となった。
  • 型を厳格に扱えるようになった。

注意点

  • クラス内のプロパティ、メソッドに権限付けがされているか
  • phpdoc(PHPDocumentor)は必ず書く。PHPStormのコード解析にも役に経つし、ドキュメントを作りやすい。

参考

  • 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
  • 「保守性が劇的に上がるPHPのスマートな書き方12選」ネタにマジレスしてみる件
    • http://xxxx7.com/2014/08/12/230309