Submit Search
PHP基礎勉強会
•
22 likes
•
9,246 views
Yuji Otani
Follow
社内で行ったPHP基礎勉強会の資料です。深い内容までは踏み込んでいませんが、幅広い内容を取り上げています。
Read less
Read more
1 of 113
More Related Content
PHP基礎勉強会
1.
PHP勉強会
〜基礎編〜 株式会社シーエー・アドバンス 大谷 祐司
2.
はじめに 今回の勉強会は、シーエー・アドバンスで採 用している開発言語「PHP」について、基礎 的な内容を中心に幅広い内容でお届けします。 普段何気なく使用しているPHPについて、知 識を整理する機会にできればと思います。
3.
アジェンダ ○PHPの歴史 ○基本的な構文/概念 ○拡張モジュールについて ○フレームワーク ○パフォーマンスチューニング ○その他まめ知識
4.
PHPの歴史
5.
PHPの歴史 突然ですが質問です。 「PHP」とは何の略でしょうか?
6.
PHPの歴史 答え:Hypertext Preprocessor (ハイパーテキストプリプロセッサー)
7.
PHPの歴史 Hypertext Preprocessor ⇒全然P・H・Pじゃない。。
8.
PHPの歴史 元々PHPは「Personal Home Page」 (パーソナルホームページ)の略でしたが、 1998年にリリースされたPHP3から意味が変 更されました。
9.
1995年:バージョン1.0 最初のバージョンは、カナダ人のラスマス・ ラードフによってリリースされました。 ソースコードを全て公開し、誰もが改良やバ グ修正をできるようにしています。
10.
1996年:バージョン2.0 SQLによるDBMSツールが統合されました。 この頃のPHPは世界で数千の熱狂的なユーザ を持ち、インターネットコンテンツの1%程 度のシェアを持っていました。
11.
1998年:PHP3.0 Zendの創業者2名によって、コード全てが書 き直されました。PHP2.0系の開発は完全に 停止され、新しいPHPとしてリリースされ ています。 ユーザも増加し、世界のインターネットコ ンテンツの10%程度のシェアになりまし た。
12.
2000年:PHP4.0 ZendEngineが組み込まれ、大幅な機能拡張 やパフォーマンスアップが実現されていま す。 人気言語として関連プロジェクトの開発も盛 んになり、インターネットの20%程度のシェ アを獲得しました。
13.
2004年:PHP5.0 ZendEngineが2.0となり、より強力なプロ グラム言語になっています。 オブジェクト指向がより一層強化され、ク ラスライブラリのSPLがサポートされるよ うになっています。
14.
2012年:PHP5.4 5.3から実装された名前空間、クロージャ、 GC等に加え、traitやビルトインサーバな ど、多くの機能が追加されています。 既にPHP5.5の仕様が公開されるなど、とて も開発が活発なプログラム言語です。
15.
PHPのサポート 現在サポートされているのはPHP5.3以降の バージョンのみで、それ以前のバージョンは 対象外となっています。 サポート対象外のバージョンはセキュリティ パッチ等が配布されていないので注意が必要 です。
16.
基本的な構文/概念
17.
処理の開始 メインとなるPHPがキックされ、その処理を 起点にしてプログラムの実行が開始されます。 Javaのようにオブジェクト指向で全てを完結 させるのではなく、手続き型の処理を起点と しています。
18.
関数型とオブジェクト型 PHPは関数型とオブジェクト型、両方の記述 方法を使用する事ができます。 PHP4までは関数型が中心でしたが、PHP5 以降はオブジェクト型の機能追加が活発です。 フレームワークもオブジェクト型に移行する ものが多くなっています。
19.
function functionは下記の3つが基本になっています。 「引数」「処理」「戻り値」
20.
function 質問: どうしてfunctionが必要なのでしょうか?
21.
function 答え: ・処理を1カ所に切り出し分かりやすくす る。 ・単体テストを効率化する。 ・同じ種類の処理を纏め、ソースの可読性を 上げる。 etc
22.
function 質問: 戻り値を返さずにfunctionを抜ける方法は?
23.
function 答え: Exceptionを投げる。
24.
Exceptionとは 例外発生時に投げられるクラス。 tryブロックで囲んだ部分の例外は、catchで 捉えて例外処理を行う事が出来る。 拡張することで、独自の例外クラスを作成す ることも可能。
25.
文字列の「”」と「’」 PHPの文字列は、「”」と「’」のどちらでも 記述することが可能です。 この2つの違いは何でしょうか?
26.
文字列の「”」と「’」 「”」⇒文字列中の変数を解析します。 例) $name = 'red'; echo
"frame is $name"; 結果: frame is red
27.
文字列の「”」と「’」 「’」⇒文字列中の変数を解析しません。 例) $name = 'red'; echo
‘frame is $name’; 結果: frame is $name
28.
ヒアドキュメント マークで囲まれた部分を文字列とします。 例) $str0 = <<<
DOC_END XXXXXXXXXXXXX DOC_END; ※赤文字の部分がマーク。
29.
define defineを使用して定数を定義します。 例) define(‘MY_DEFINE’, ‘AAAAA’); それでは、同じ定数を2回定義するとどうな るでしょうか?
30.
define 答え: 2回目のdefineは無視される。 defineは、同じキーで1回のみ定義が可能で す。関数 defined($name)を使用して、その 定数が定義済みかを確認できます。
31.
配列について PHPの配列は、連想配列が基本です。 例) $sample_array = array(); $sample_array*+
= “a”; $sample_array*+ = “b”; 配列の中身 ⇒array(0 =>“a”, 1=>”b”);
32.
配列について 配列は、設定した順に値を持ちます。 例) $sample_array = array(); $sample_array*2+
= “a”; $sample_array*0+ = “b”; 配列の中身 ⇒array(2 =>“a”, 0=>”b”);
33.
配列について 「整数」または「文字列」をキーに持つこと ができます。 例) $sample_array = array(); $sample_array*“1”+
= “a”; $sample_array*“2”+ = “b”; 配列の中身 ⇒array(“1”=>“a”,“2”=>”b”);
34.
オブジェクトについて オブジェクトには、任意の値を設定できます。 メンバ変数として定義されたものはもちろん、 未定義の変数も渡すことができます。 アクセスが「public」になるので要注意です。 例) $sample_obj = new
SampleObject(); $sample_obj->no_varieble = “1”; ※クラスに未定義でも指定できます。
35.
const constは、クラス内に定数を定義できます。 例) Class AAA {
const MY_CONST =‘const_value’; }
36.
外部ソースの読み込み 外部のソースを読み込む方法がいくつか存在 します。それぞれの違いを考えてみましょ う。 ・require ・require_once ・include ・autoload(spl_autoload_register)
37.
外部ソースの読み込み ・require 同じファイルを複数回読み込み ⇒何度も読み込まれる。 読み込みに失敗した場合 ⇒致命的なエラーが発生。 http://php.net/manual/ja/function.require.php
38.
外部ソースの読み込み ・require_once 同じファイルを複数回読み込み ⇒2回目以降は無視される。 読み込みに失敗した場合 ⇒致命的なエラーが発生。 http://php.net/manual/ja/function.require-once.php
39.
外部ソースの読み込み ・include 同じファイルを複数回読み込み ⇒何度も読み込まれる。 読み込みに失敗した場合 ⇒警告が出るが、処理は中断されず。 http://php.net/manual/ja/function.include.php
40.
外部ソースの読み込み ・autoload(spl_autoload_register) 未定義のクラスを、呼び出したタイミングで 自動的に呼び出せるようにします。 クラスごとにrequire_once関数を呼び出す必 要がなくなるので、コードがシンプルになり ます。
41.
外部ソースの読み込み ・autoload(spl_autoload_register) また、スクリプト内で使用するかどうか分か らないクラスをインクルードしなくても済む ので処理上のオーバーヘッドが軽減します。 http://php.net/manual/ja/function.spl- autoload-register.php
42.
SPL SPL(Standard PHP Library)を使用すると、 言語機能の拡張やデザインパターンの実装が 可能になります。SPLはクラスにインタ フェースとして実装します。 本日はよく使われるものを紹介します。 http://php.net/manual/ja/book.spl.php
43.
SPL Countable:オブジェクトにcount()が使用できる ようにします。 例) $obj = new
$obj; $count = count($obj); http://php.tonnikala.org/manual/ja/class.countable.php
44.
SPL ArrayAccess:オブジェクトを配列のように扱う 事ができます。 例) $obj = new
$obj; $obj*$key+ = “testval”; $str = $obj[$key]; http://php.net/manual/ja/class.arrayaccess.php
45.
SPL Serializable:独自のシリアライズを実装すること ができます。 例) $obj = new
$obj; $ser = serialize($obj); $newopj = serialize(ser); http://php.net/manual/ja/class.serializable.php
46.
SPL その他にも、多くのSPLライブラリが存在し ます。知っておくと便利なものも多いので、 是非見てみてください。 http://php.net/manual/ja/book.spl.php
47.
ガベージコレクション PHPの変数やオブジェクトは、 ・参照されなくなる ・unsetされる これらの操作で破棄されます。 破棄されたオブジェクトは、ガベージコレク ション実行のタイミングでメモリから削除さ れます。
48.
ガベージコレクション ガベージコレクションを有効にするには、コ ンパイル時に「enable_gc=1」を指定しま す。 phpinfo()では、「zend.enable_gc」で確認す ることができます。この設定が無効だと、メ モリ使用量が大きく増加します。
49.
ガベージコレクション gc_collect_cycles()を実行すると、強制的に ガベージコレクションを行う事ができます。 PHP5.3以上で使用する事ができます。
50.
MySQLコネクション MySQLのライブラリが複数存在しま す。 ・php_mysql ・php_mysqli ・php_pdo ・PEAR:DB それぞれについて見ていきましょう。
51.
php_mysql PHP2.0から実装されているライブラリです。 既に開発は停止されており、保守対応のみと なっています。 オブジェクト指向での実装はできず、PHP5.5 からは非推奨ライブラリになりました。 新規の開発では使用しない方が良いでしょう。
52.
php_mysqli PHP5.0以降で使用可能なライブラリです。関 数とオブジェクト指向の両方で呼び出しが可 能です。 php_mysqlの機能を拡張しており、プリペア ドステートメントの利用や複数クエリの一括 実行等が可能になっています。
53.
php_pdo PHPの拡張モジュールとして動作するドライ バです。単独でデータベース抽象化レイヤー の機能を有しており、同一のコードで複数の DBに対応させる事ができます。 オブジェクト指向に特化して実装されており、 例外処理を扱う事ができます。SQLの結果を クラスで取得する事もできます。
54.
PEAR:DB PHPで記述されたライブラリで、PDOなどと 同様にデータベースに依存しない形でプログ ラムの記述が出来ます。 しかし拡張ライブラリとして実装されている PDOの方が高速に動作するため、特別な理由 が無ければ選択しない方が良いでしょう。
55.
メモリ使用量 PHPから関数を実行してメモリの使用量を確 認する事ができます。 memory_get_usage(); ⇒現在のメモリ使用量を返します。 memory_peak_get_usage(); ⇒実行中プログラムにおける、最大時のメモ リ使用量を返します。
56.
変数コンテナ PHPの変数はzvalと呼ばれるコンテナに格納 されています。参照数のカウンタを保持して おり、参照数が0になるとガベージコレク ションの対象になります。 debug_zval_dump($data); ⇒$dataが参照されている数を確認する事が できます。がベージコレクションの対象かを 確認する事ができます。
57.
比較演算子 PHPの特徴的な比較演算子を紹介します。 「===」 ⇒型まで見て比較を行います。 「strcasecmp()」 ⇒大文字小文字を区別しない文字列比較。 「strcmp()」 ⇒大文字小文字を区別する文字列比較。
58.
配列演算子 「$a + $b」 ⇒$aと$bを結合する。 「
$a == $b」 ⇒$a と $b のキー/値のペアが等しい場合にtrue。 「 $a === $b」 ⇒$a と$b のキー/値のペアが等しく、その並び順 が等しく、 かつデータ型も等しい場合に true。
59.
文字コード 文字化けを防ぐため、PHPで使用する文 字コードは以下の記述を全て統一します。 ・php.iniのmbstring.internal_encoding ・php.iniのdefault_charset ・DBコネクションの文字コード (set names
XX) ・ソースコードの文字コード
60.
phpinfo() phpinfo()を使用すると、PHPの情報を確認す ることができます。 ・PHPのバージョン。 ・設定ファイル「php.ini」の場所。 ・拡張ライブラリのフォルダ。 ・有効な拡張ライブラリ。 etc
61.
文字列で関数名を指定する 関数名を文字列として変数に代 入して、()で呼び出すことができ ます。 <?php
function myfunc() { echo "call myfuncn"; } $f = "myfunc"; $f(); ?>
62.
文字列でクラス名を指定する クラス名を変数で指定することで。ク ラスをインスタンス化することができ ます。 <?php
class TestClass { echo "call myfunc"; } $classname = “TestClass”; $testClass = new $classname(); ?>
63.
PHPのオブジェクト指向 質問: オブジェクト指向はどのような言語ですか? 特徴を挙げてください。
64.
オブジェクト指向とは オブジェクト同士の相互作用としてシステ ムの振る舞いをとらえる考え方です。 関連するデータの集合と、それに対する手 続きを「オブジェクト」と呼ばれる一つの まとまりとして管理し、その組み合わせに よってソフトウェアを構築します。
65.
オブジェクト指向とは 存在するオブジェクトについては、利用に 際してその内部構造や動作原理の詳細を知 る必要はなく、外部からメッセージを送れ ば機能します。 大規模なソフトウェア開発において有効な 考え方であるとされています。
66.
覚えておきたいクラスの用語 コンストラクタ デストラクタ 継承 実装
67.
覚えておきたいクラスの機能 メンバ変数 アクセッサ Static関数 Form インスタンス化 オブジェクトの破棄
68.
拡張モジュール
69.
標準の拡張モジュール 質問: PHP標準の拡張モジュールを思い つく限り上げてください。
70.
標準の拡張モジュール pdo, mysql, openssl,
curl, mysqli, gzip etc… PHPは標準で様々な拡張モジュールを使用 する事ができます。
71.
PEAR 標準のモジュール以外にも、便利な機能を簡 単に使用できる「PEAR」という拡張モ ジュールが存在します。
72.
PEAR PHP Extension and
Application Repositoryの 略です。コミュニティーによって運営され るプロジェクトで、1999年に創設されまし た。 12月現在で37カテゴリ/590もの拡張ライ ブラリを利用する事ができます。
73.
PEAR ミッション ・再利用可能なコンポーネントを提供するこ と ・PHP の発展に寄与すること ・よい開発手法を PHP
開発者たちに広める こと
74.
PEAR コーディングにあたり、PEAR 標準コーディ ング規約 (PEAR
Coding Standards: PCS)が 定められています。 これにより、複数の開発者における共同開発 が容易になり、品質が安定しています。 http://pear.php.net/manual/ja/standards.php
75.
PEAR PEAR パッケージはすべて pear.php.netに登 録され、そこからダウンロードすることがで きます。 開発機からPEARインストール用コマンドを 実行すると、容易にライブラリの追加を行う 事が可能です。
76.
PEAR 代表的なPEARのライブラリ DB(DBアクセス) Mail(メールの送信) FTP(FTPの操作) Net(ソケット通信やTelnet)
77.
PECL peclコマンドでインストール可能な、Cで 書かれた拡張ライブラリ。コンパイルされ ているコードを実行するので、実行速度が 速いのが特徴です。 2012年12月現在で34カテゴリ/296の拡張 パッケージを利用する事ができます。
78.
PECL 代表的なPECLのライブラリ imagick(画像関連の操作) json(JSON関連の操作) memcached(memcachedに対する操作) oauth(Oauth認証に関する操作)
79.
その他のライブラリ PHPには組織やコミュニティベースでライブ ラリが配布されているものも多く存在します。 これらはサイトからモジュールをダウンロー ドし、読み込むことで使用可能になります。
80.
その他のライブラリ 代表的なライブラリ JpGraph(グラフを生成する) PHPExcel, pChart(Excel関連の操作) FPDF/TCPDF(PDF関連の操作) phpThumb/class.image(画像関連の操作)
81.
おまけ:Cの拡張ライブラリ開発方法 Cの拡張ライブラリは誰でも開発する事が 可能です。 PHPで書くよりも高速で動作するために、 よりパフォーアンスが求められる拡張機能 に活用される事が多いです。
82.
フレームワーク
83.
フレームワークとは フレームワークとは、アプリケーションの 開発時に必要となる汎用的な機能を纏めて 提供し、アプリケーションの土台として機 能するソフトウェアです。
84.
フレームワークとは 質問: フレームワーク導入のメリット/デメリッ トを上げてみてください。
85.
フレームワーク導入のメリット ・汎用的機能の開発工数が抑えられる。 ・開発経験を持つメンバーを集めやすい。 ・テスト済みで、運用実績のあるシステムを すぐに作る事ができる。 ・MVCなど、デザインパターンに従った開 発を行う事ができる。 ・書籍などから情報を集めやすい。
86.
フレームワーク導入のデメリット ・採用したものが流行によって廃れてしま う場合がある。 ・フレームワークがPHPのバージョンアッ プについていけない場合がある。 ・必要な機能が無い場合、フレームワーク 本体に手を加えなければいけない事もある。
87.
フレームワークについて 現行のPHPフレームワークは、ほとんどが MVCモデルに基づいています。 Model:処理の中核を担う。 View:画面の表示・出力を担う。 Contoroller:ViewとModelを制御する。 http://e-words.jp/w/MVC.html
88.
フレームワークについて 今回は、PHPの代表的なフレームワークを いくつか紹介します。
89.
CakePHP 最新バージョン:2.2 PHPバージョン:5.2以上 開発元:Cakeソフトウェア財団 URL:http://cakephp.jp/
90.
CakePHP 特徴 ・小・中規模開発向け ・日本ではもっとも人気がある ・「設定より規約」の思想のもと、多くの ルールがある。自由度は高くない。
91.
Symphony 最新バージョン:2.1 PHPバージョン:5.3以上 開発元:Sensio社 URL:http://symfony.com/
92.
Symphony 特徴 ・大規模重厚 ・多機能な分、インストールや習得に多くの 時間がかかる。 ・シンプル・高速 ・対象ドメイン独立な本体の設計
93.
CodeIgniter 最新バージョン:2.1 PHPバージョン:5.1以上 開発元:EllisLab URL:http://ellislab.com/codeigniter
94.
CodeIgniter 特徴 ・軽量高速 ・小規模開発向け ・ライセンス問題で話題になっている
95.
FuelPHP 最新バージョン:1.3 PHPバージョン:5.3以上 開発元:コミュニティ(100名以上の開発 者) URL:http://www.fuelphp.com/
96.
FuelPHP 特徴 ・2011年にリリース ・軽量高速 ・小規模開発向け ・PHP5.3の機能をフル活用 ・MongoDB/Redisをサポート
97.
ZendFramework 最新バージョン:2.0 PHPバージョン:5.3以上 開発元:Zend社(PHP開発元) URL:http://framework.zend.com/
98.
Lemonade 最新バージョン:0.4 PHPバージョン:5.1以上 開発元:? URL:http://lemonade-php-script- creator.en.softonic.com/
99.
Lemonade 特徴 ・軽量なマイクロフレームワーク ・Rubyのsinatraに影響を受けている ・導入も非常に簡単で、学習コストも低い
100.
Ethna 最新バージョン:2.5 PHPバージョン:5.0以上 開発元:GREE 採用実績:GREE
101.
Ethna 特徴 ・ライトウェイトなMVCフレームワーク。 ・似たようなコードを書かなくてよいこと が目標。 ・国産フレームワーク
102.
フレームワーク利用にあたって 今後も様々なフレームワークが出てくると 思いますが、目的が何かをきちんと見極め た上で選択する事が必要だと思います。 またフレームワークの内部処理を理解し、 処理を任せきりにしない事が大切です。
103.
PHPのパフォーマンスUP (今回は2つだけ紹介します)
104.
ループの条件はループの前で書く ループの条件をfor文の中で行うと、都度の ループ回数評価が発生します、必ずfor文の 前で行うようにしましょう。
105.
ループの条件はループの前で書く 良い例) $roop_count = count($target_array); for
($i = 0; $i < $roop_count; $i++) { // for文中の処理 } 悪い例) for ($i = 0; $i < count($target_array); $i++) { // for文中の処理 }
106.
中間コンパイラを導入する アクセラレータは初回実行時に、コンパイル済
のバイトコードをメモリ上にキャッシュしま す。これによって高速な実行を実現します。 PHP実行イメージ 初回実行時に メモリにキャッシュ コンパイ 解析 ル PHPソースコード バイトコード 実行
107.
中間コンパイラを導入する ・eAccelerator http://eaccelerator.net/ ・APC http://php.net/manual/ja/book.apc.php
108.
おまけ:PHP認定資格
109.
PHP資格 PHP技術者認定試験という、PHPのスキルを 認定する資格が存在します。 「認定者の雇用機会」や「認定者が所属する 会社のビジネスチャンス」の拡大を図ること を目的として、2011年に開始されました。 http://www.phpexam.jp/
110.
PHP資格 初級:PHPプログラミングの基本知識を問 う試験 受験料:12,600円 合格率:68%
111.
PHP資格 上級:言語仕様から実用的なプログラミン グテクニックまでの知識を問う試験 受験料:15,750円 合格率:10%
112.
PHP資格 ウィザード:PHPの発展に貢献できる知識と 発想力を持つこと 受験料:無料 合格率:0%
113.
勉強会は以上になります。 ご清聴ありがとうございました。