SlideShare a Scribd company logo
PHP勉強会
    〜基礎編〜


株式会社シーエー・アドバンス
    大谷 祐司
はじめに

今回の勉強会は、シーエー・アドバンスで採
用している開発言語「PHP」について、基礎
的な内容を中心に幅広い内容でお届けします。

普段何気なく使用しているPHPについて、知
識を整理する機会にできればと思います。
アジェンダ

○PHPの歴史
○基本的な構文/概念
○拡張モジュールについて
○フレームワーク
○パフォーマンスチューニング
○その他まめ知識
PHPの歴史
PHPの歴史




突然ですが質問です。
「PHP」とは何の略でしょうか?
PHPの歴史


答え:Hypertext Preprocessor
(ハイパーテキストプリプロセッサー)
PHPの歴史


Hypertext Preprocessor
⇒全然P・H・Pじゃない。。
PHPの歴史

元々PHPは「Personal Home Page」
(パーソナルホームページ)の略でしたが、
1998年にリリースされたPHP3から意味が変
更されました。
1995年:バージョン1.0

最初のバージョンは、カナダ人のラスマス・
ラードフによってリリースされました。

ソースコードを全て公開し、誰もが改良やバ
グ修正をできるようにしています。
1996年:バージョン2.0

SQLによるDBMSツールが統合されました。
この頃のPHPは世界で数千の熱狂的なユーザ
を持ち、インターネットコンテンツの1%程
度のシェアを持っていました。
1998年:PHP3.0

Zendの創業者2名によって、コード全てが書
き直されました。PHP2.0系の開発は完全に
停止され、新しいPHPとしてリリースされ
ています。

ユーザも増加し、世界のインターネットコ
ンテンツの10%程度のシェアになりまし
た。
2000年:PHP4.0

ZendEngineが組み込まれ、大幅な機能拡張
やパフォーマンスアップが実現されていま
す。

人気言語として関連プロジェクトの開発も盛
んになり、インターネットの20%程度のシェ
アを獲得しました。
2004年:PHP5.0

ZendEngineが2.0となり、より強力なプロ
グラム言語になっています。

オブジェクト指向がより一層強化され、ク
ラスライブラリのSPLがサポートされるよ
うになっています。
2012年:PHP5.4

5.3から実装された名前空間、クロージャ、
GC等に加え、traitやビルトインサーバな
ど、多くの機能が追加されています。

既にPHP5.5の仕様が公開されるなど、とて
も開発が活発なプログラム言語です。
PHPのサポート

現在サポートされているのはPHP5.3以降の
バージョンのみで、それ以前のバージョンは
対象外となっています。

サポート対象外のバージョンはセキュリティ
パッチ等が配布されていないので注意が必要
です。
基本的な構文/概念
処理の開始

メインとなるPHPがキックされ、その処理を
起点にしてプログラムの実行が開始されます。


Javaのようにオブジェクト指向で全てを完結
させるのではなく、手続き型の処理を起点と
しています。
関数型とオブジェクト型

PHPは関数型とオブジェクト型、両方の記述
方法を使用する事ができます。

PHP4までは関数型が中心でしたが、PHP5
以降はオブジェクト型の機能追加が活発です。
フレームワークもオブジェクト型に移行する
ものが多くなっています。
function


functionは下記の3つが基本になっています。
「引数」「処理」「戻り値」
function



質問:
どうしてfunctionが必要なのでしょうか?
function

答え:
・処理を1カ所に切り出し分かりやすくす
る。
・単体テストを効率化する。
・同じ種類の処理を纏め、ソースの可読性を
上げる。
etc
function



質問:
戻り値を返さずにfunctionを抜ける方法は?
function

答え:
Exceptionを投げる。
Exceptionとは

例外発生時に投げられるクラス。

tryブロックで囲んだ部分の例外は、catchで
捉えて例外処理を行う事が出来る。

拡張することで、独自の例外クラスを作成す
ることも可能。
文字列の「”」と「’」


PHPの文字列は、「”」と「’」のどちらでも
記述することが可能です。

この2つの違いは何でしょうか?
文字列の「”」と「’」


「”」⇒文字列中の変数を解析します。

例)
$name = 'red';
echo "frame is $name";

結果: frame is red
文字列の「”」と「’」


「’」⇒文字列中の変数を解析しません。

例)
$name = 'red';
echo ‘frame is $name’;

結果: frame is $name
ヒアドキュメント


マークで囲まれた部分を文字列とします。
例)
$str0 = <<< DOC_END
XXXXXXXXXXXXX
DOC_END;
※赤文字の部分がマーク。
define


defineを使用して定数を定義します。
例)
define(‘MY_DEFINE’, ‘AAAAA’);


それでは、同じ定数を2回定義するとどうな
るでしょうか?
define

答え:
2回目のdefineは無視される。

defineは、同じキーで1回のみ定義が可能で
す。関数 defined($name)を使用して、その
定数が定義済みかを確認できます。
配列について


PHPの配列は、連想配列が基本です。

例)
$sample_array = array();
$sample_array*+ = “a”;
$sample_array*+ = “b”;

配列の中身
⇒array(0 =>“a”, 1=>”b”);
配列について


配列は、設定した順に値を持ちます。

例)
$sample_array = array();
$sample_array*2+ = “a”;
$sample_array*0+ = “b”;

配列の中身
⇒array(2 =>“a”, 0=>”b”);
配列について


「整数」または「文字列」をキーに持つこと
ができます。

例)
$sample_array = array();
$sample_array*“1”+ = “a”;
$sample_array*“2”+ = “b”;

配列の中身
⇒array(“1”=>“a”,“2”=>”b”);
オブジェクトについて

オブジェクトには、任意の値を設定できます。
メンバ変数として定義されたものはもちろん、
未定義の変数も渡すことができます。
アクセスが「public」になるので要注意です。

例)
$sample_obj = new SampleObject();
$sample_obj->no_varieble = “1”;
※クラスに未定義でも指定できます。
const

constは、クラス内に定数を定義できます。


例)
Class AAA {
      const MY_CONST =‘const_value’;
}
外部ソースの読み込み

外部のソースを読み込む方法がいくつか存在
します。それぞれの違いを考えてみましょ
う。
・require
・require_once
・include
・autoload(spl_autoload_register)
外部ソースの読み込み

・require
同じファイルを複数回読み込み
⇒何度も読み込まれる。

読み込みに失敗した場合
⇒致命的なエラーが発生。
http://php.net/manual/ja/function.require.php
外部ソースの読み込み

・require_once
同じファイルを複数回読み込み
⇒2回目以降は無視される。

読み込みに失敗した場合
⇒致命的なエラーが発生。
http://php.net/manual/ja/function.require-once.php
外部ソースの読み込み

・include
同じファイルを複数回読み込み
⇒何度も読み込まれる。

読み込みに失敗した場合
⇒警告が出るが、処理は中断されず。
http://php.net/manual/ja/function.include.php
外部ソースの読み込み

・autoload(spl_autoload_register)
未定義のクラスを、呼び出したタイミングで
自動的に呼び出せるようにします。

クラスごとにrequire_once関数を呼び出す必
要がなくなるので、コードがシンプルになり
ます。
外部ソースの読み込み

・autoload(spl_autoload_register)
また、スクリプト内で使用するかどうか分か
らないクラスをインクルードしなくても済む
ので処理上のオーバーヘッドが軽減します。
http://php.net/manual/ja/function.spl-
autoload-register.php
SPL
SPL(Standard PHP Library)を使用すると、
言語機能の拡張やデザインパターンの実装が
可能になります。SPLはクラスにインタ
フェースとして実装します。

本日はよく使われるものを紹介します。

http://php.net/manual/ja/book.spl.php
SPL
Countable:オブジェクトにcount()が使用できる
ようにします。

例)
$obj = new $obj;
$count = count($obj);

http://php.tonnikala.org/manual/ja/class.countable.php
SPL
ArrayAccess:オブジェクトを配列のように扱う
事ができます。

例)
$obj = new $obj;
$obj*$key+ = “testval”;
$str = $obj[$key];

http://php.net/manual/ja/class.arrayaccess.php
SPL
Serializable:独自のシリアライズを実装すること
ができます。

例)
$obj = new $obj;
$ser = serialize($obj);
$newopj = serialize(ser);

http://php.net/manual/ja/class.serializable.php
SPL

その他にも、多くのSPLライブラリが存在し
ます。知っておくと便利なものも多いので、
是非見てみてください。

http://php.net/manual/ja/book.spl.php
ガベージコレクション

PHPの変数やオブジェクトは、
・参照されなくなる
・unsetされる
これらの操作で破棄されます。

破棄されたオブジェクトは、ガベージコレク
ション実行のタイミングでメモリから削除さ
れます。
ガベージコレクション

ガベージコレクションを有効にするには、コ
ンパイル時に「enable_gc=1」を指定しま
す。

phpinfo()では、「zend.enable_gc」で確認す
ることができます。この設定が無効だと、メ
モリ使用量が大きく増加します。
ガベージコレクション


gc_collect_cycles()を実行すると、強制的に
ガベージコレクションを行う事ができます。
PHP5.3以上で使用する事ができます。
MySQLコネクション

MySQLのライブラリが複数存在しま
す。
・php_mysql
・php_mysqli
・php_pdo
・PEAR:DB
それぞれについて見ていきましょう。
php_mysql

PHP2.0から実装されているライブラリです。
既に開発は停止されており、保守対応のみと
なっています。

オブジェクト指向での実装はできず、PHP5.5
からは非推奨ライブラリになりました。

新規の開発では使用しない方が良いでしょう。
php_mysqli

PHP5.0以降で使用可能なライブラリです。関
数とオブジェクト指向の両方で呼び出しが可
能です。

php_mysqlの機能を拡張しており、プリペア
ドステートメントの利用や複数クエリの一括
実行等が可能になっています。
php_pdo

PHPの拡張モジュールとして動作するドライ
バです。単独でデータベース抽象化レイヤー
の機能を有しており、同一のコードで複数の
DBに対応させる事ができます。

オブジェクト指向に特化して実装されており、
例外処理を扱う事ができます。SQLの結果を
クラスで取得する事もできます。
PEAR:DB

PHPで記述されたライブラリで、PDOなどと
同様にデータベースに依存しない形でプログ
ラムの記述が出来ます。

しかし拡張ライブラリとして実装されている
PDOの方が高速に動作するため、特別な理由
が無ければ選択しない方が良いでしょう。
メモリ使用量

PHPから関数を実行してメモリの使用量を確
認する事ができます。

memory_get_usage();
⇒現在のメモリ使用量を返します。

memory_peak_get_usage();
⇒実行中プログラムにおける、最大時のメモ
リ使用量を返します。
変数コンテナ

PHPの変数はzvalと呼ばれるコンテナに格納
されています。参照数のカウンタを保持して
おり、参照数が0になるとガベージコレク
ションの対象になります。

debug_zval_dump($data);
⇒$dataが参照されている数を確認する事が
できます。がベージコレクションの対象かを
確認する事ができます。
比較演算子

PHPの特徴的な比較演算子を紹介します。

「===」
⇒型まで見て比較を行います。

「strcasecmp()」
⇒大文字小文字を区別しない文字列比較。

「strcmp()」
⇒大文字小文字を区別する文字列比較。
配列演算子

「$a + $b」
⇒$aと$bを結合する。

「 $a == $b」
⇒$a と $b のキー/値のペアが等しい場合にtrue。

「 $a === $b」
⇒$a と$b のキー/値のペアが等しく、その並び順
が等しく、 かつデータ型も等しい場合に true。
文字コード

文字化けを防ぐため、PHPで使用する文
字コードは以下の記述を全て統一します。

・php.iniのmbstring.internal_encoding
・php.iniのdefault_charset
・DBコネクションの文字コード
 (set names XX)
・ソースコードの文字コード
phpinfo()


phpinfo()を使用すると、PHPの情報を確認す
ることができます。
・PHPのバージョン。
・設定ファイル「php.ini」の場所。
・拡張ライブラリのフォルダ。
・有効な拡張ライブラリ。
etc
文字列で関数名を指定する

関数名を文字列として変数に代
入して、()で呼び出すことができ
ます。

<?php
        function myfunc() {
               echo "call myfuncn";
        }
        $f = "myfunc";
        $f();
?>
文字列でクラス名を指定する

クラス名を変数で指定することで。ク
ラスをインスタンス化することができ
ます。

<?php
        class TestClass {
                echo "call myfunc";
        }
        $classname = “TestClass”;
        $testClass = new $classname();
?>
PHPのオブジェクト指向



質問:
オブジェクト指向はどのような言語ですか?
特徴を挙げてください。
オブジェクト指向とは

オブジェクト同士の相互作用としてシステ
ムの振る舞いをとらえる考え方です。

関連するデータの集合と、それに対する手
続きを「オブジェクト」と呼ばれる一つの
まとまりとして管理し、その組み合わせに
よってソフトウェアを構築します。
オブジェクト指向とは

存在するオブジェクトについては、利用に
際してその内部構造や動作原理の詳細を知
る必要はなく、外部からメッセージを送れ
ば機能します。

大規模なソフトウェア開発において有効な
考え方であるとされています。
覚えておきたいクラスの用語


コンストラクタ
デストラクタ
継承
実装
覚えておきたいクラスの機能


メンバ変数
アクセッサ
Static関数
Form
インスタンス化
オブジェクトの破棄
拡張モジュール
標準の拡張モジュール



質問:
PHP標準の拡張モジュールを思い
つく限り上げてください。
標準の拡張モジュール



pdo, mysql, openssl, curl, mysqli, gzip etc…


PHPは標準で様々な拡張モジュールを使用
する事ができます。
PEAR


標準のモジュール以外にも、便利な機能を簡
単に使用できる「PEAR」という拡張モ
ジュールが存在します。
PEAR

PHP Extension and Application Repositoryの
略です。コミュニティーによって運営され
るプロジェクトで、1999年に創設されまし
た。

12月現在で37カテゴリ/590もの拡張ライ
ブラリを利用する事ができます。
PEAR

ミッション
・再利用可能なコンポーネントを提供するこ
と
・PHP の発展に寄与すること
・よい開発手法を PHP 開発者たちに広める
こと
PEAR

コーディングにあたり、PEAR 標準コーディ
ング規約 (PEAR Coding Standards: PCS)が
定められています。

これにより、複数の開発者における共同開発
が容易になり、品質が安定しています。

http://pear.php.net/manual/ja/standards.php
PEAR

PEAR パッケージはすべて pear.php.netに登
録され、そこからダウンロードすることがで
きます。

開発機からPEARインストール用コマンドを
実行すると、容易にライブラリの追加を行う
事が可能です。
PEAR

代表的なPEARのライブラリ


DB(DBアクセス)
Mail(メールの送信)
FTP(FTPの操作)
Net(ソケット通信やTelnet)
PECL

peclコマンドでインストール可能な、Cで
書かれた拡張ライブラリ。コンパイルされ
ているコードを実行するので、実行速度が
速いのが特徴です。

2012年12月現在で34カテゴリ/296の拡張
パッケージを利用する事ができます。
PECL


代表的なPECLのライブラリ


imagick(画像関連の操作)
json(JSON関連の操作)
memcached(memcachedに対する操作)
oauth(Oauth認証に関する操作)
その他のライブラリ


PHPには組織やコミュニティベースでライブ
ラリが配布されているものも多く存在します。

これらはサイトからモジュールをダウンロー
ドし、読み込むことで使用可能になります。
その他のライブラリ

代表的なライブラリ


JpGraph(グラフを生成する)
PHPExcel, pChart(Excel関連の操作)
FPDF/TCPDF(PDF関連の操作)
phpThumb/class.image(画像関連の操作)
おまけ:Cの拡張ライブラリ開発方法


Cの拡張ライブラリは誰でも開発する事が
可能です。

PHPで書くよりも高速で動作するために、
よりパフォーアンスが求められる拡張機能
に活用される事が多いです。
フレームワーク
フレームワークとは

フレームワークとは、アプリケーションの
開発時に必要となる汎用的な機能を纏めて
提供し、アプリケーションの土台として機
能するソフトウェアです。
フレームワークとは

質問:
フレームワーク導入のメリット/デメリッ
トを上げてみてください。
フレームワーク導入のメリット

・汎用的機能の開発工数が抑えられる。
・開発経験を持つメンバーを集めやすい。
・テスト済みで、運用実績のあるシステムを
すぐに作る事ができる。
・MVCなど、デザインパターンに従った開
発を行う事ができる。
・書籍などから情報を集めやすい。
フレームワーク導入のデメリット

・採用したものが流行によって廃れてしま
う場合がある。
・フレームワークがPHPのバージョンアッ
プについていけない場合がある。
・必要な機能が無い場合、フレームワーク
本体に手を加えなければいけない事もある。
フレームワークについて

現行のPHPフレームワークは、ほとんどが
MVCモデルに基づいています。

Model:処理の中核を担う。
View:画面の表示・出力を担う。
Contoroller:ViewとModelを制御する。

http://e-words.jp/w/MVC.html
フレームワークについて


今回は、PHPの代表的なフレームワークを
いくつか紹介します。
CakePHP

最新バージョン:2.2
PHPバージョン:5.2以上
開発元:Cakeソフトウェア財団
URL:http://cakephp.jp/
CakePHP

特徴
・小・中規模開発向け
・日本ではもっとも人気がある
・「設定より規約」の思想のもと、多くの
ルールがある。自由度は高くない。
Symphony

最新バージョン:2.1
PHPバージョン:5.3以上
開発元:Sensio社
URL:http://symfony.com/
Symphony

特徴
・大規模重厚
・多機能な分、インストールや習得に多くの
時間がかかる。
・シンプル・高速
・対象ドメイン独立な本体の設計
CodeIgniter

最新バージョン:2.1
PHPバージョン:5.1以上
開発元:EllisLab
URL:http://ellislab.com/codeigniter
CodeIgniter

特徴
・軽量高速
・小規模開発向け
・ライセンス問題で話題になっている
FuelPHP

最新バージョン:1.3
PHPバージョン:5.3以上
開発元:コミュニティ(100名以上の開発
者)
URL:http://www.fuelphp.com/
FuelPHP

特徴
・2011年にリリース
・軽量高速
・小規模開発向け
・PHP5.3の機能をフル活用
・MongoDB/Redisをサポート
ZendFramework

最新バージョン:2.0
PHPバージョン:5.3以上
開発元:Zend社(PHP開発元)
URL:http://framework.zend.com/
Lemonade

最新バージョン:0.4
PHPバージョン:5.1以上
開発元:?
URL:http://lemonade-php-script-
creator.en.softonic.com/
Lemonade

特徴
・軽量なマイクロフレームワーク
・Rubyのsinatraに影響を受けている
・導入も非常に簡単で、学習コストも低い
Ethna

最新バージョン:2.5
PHPバージョン:5.0以上
開発元:GREE
採用実績:GREE
Ethna

特徴
・ライトウェイトなMVCフレームワーク。
・似たようなコードを書かなくてよいこと
が目標。
・国産フレームワーク
フレームワーク利用にあたって

今後も様々なフレームワークが出てくると
思いますが、目的が何かをきちんと見極め
た上で選択する事が必要だと思います。

またフレームワークの内部処理を理解し、
処理を任せきりにしない事が大切です。
PHPのパフォーマンスUP
 (今回は2つだけ紹介します)
ループの条件はループの前で書く


ループの条件をfor文の中で行うと、都度の
ループ回数評価が発生します、必ずfor文の
前で行うようにしましょう。
ループの条件はループの前で書く

良い例)
$roop_count = count($target_array);
for ($i = 0; $i < $roop_count; $i++) {
        // for文中の処理
}

悪い例)
for ($i = 0; $i < count($target_array); $i++) {
        // for文中の処理
}
中間コンパイラを導入する

  アクセラレータは初回実行時に、コンパイル済
  のバイトコードをメモリ上にキャッシュしま
  す。これによって高速な実行を実現します。

PHP実行イメージ


                         初回実行時に
                       メモリにキャッシュ

                コンパイ
                                   解析
                  ル

    PHPソースコード          バイトコード           実行
中間コンパイラを導入する

・eAccelerator
http://eaccelerator.net/

・APC
http://php.net/manual/ja/book.apc.php
おまけ:PHP認定資格
PHP資格

PHP技術者認定試験という、PHPのスキルを
認定する資格が存在します。

「認定者の雇用機会」や「認定者が所属する
会社のビジネスチャンス」の拡大を図ること
を目的として、2011年に開始されました。

http://www.phpexam.jp/
PHP資格

初級:PHPプログラミングの基本知識を問
う試験

受験料:12,600円

合格率:68%
PHP資格

上級:言語仕様から実用的なプログラミン
グテクニックまでの知識を問う試験

受験料:15,750円

合格率:10%
PHP資格

ウィザード:PHPの発展に貢献できる知識と
発想力を持つこと

受験料:無料

合格率:0%
勉強会は以上になります。
ご清聴ありがとうございました。

More Related Content

PHP基礎勉強会