PHP(PHP:Hypertext Preprocessor)とは、動的なウェブページを表現するために動的なHTMLを出力することに特化したプログラミング言語、またはその処理系である。非常に高速に動作するCGIの仲間である。
なお、PHPとはpersonal homepageから来ているらしいが、今はPHPはPHPであり、PHP Hypertext Processerの略としている。
曖昧さ回避
概要
PHPは、Webサーバー上で実行するサーバーサイドスクリプティング言語である。動的なページを実現するためにPHPグループがオープンソースシステムとして開発をしていて、誰でも自由に利用することができる。Webアプリケーション開発によく利用され、世界中の約2000万ドメイン以上で使用されているとして知られている。
また、PHPはインタープリタ型のプログラミング言語でPerlと同じようにソースファイルをコンパイルせずに実行することができる。ただし、コンパイルしないので当然ネイティブコード(機械語)をはき出さない。
書き方も特徴的で、プログラムのソースコードをHTML内に埋め込む事ができ、動的でないHTML部分を出力する場合において非常に単純な出力方法となる。
PHPの魅力は、PostgreSQL、MySQL、SQLite、Oracle、MSSQLなどの数十のデータベースに対応しており、幅広く活用できる点であり、高度なWebアプリケーションが作成できることである。
文法についてはC言語およびC言語から派生した言語の文法によく似ていて、C、C++、Javaなどのメジャーなプログラミング言語を習得したプログラマーが違和感なく利用できるような文法を採用している。加えて、ある程度直感的に扱える言語設計になっているので、初心者でも取っ付きやすいと言われている。
だが、簡単で動きやすい反面、冗長なスパゲッティコードにもなりやすく、一定の品質を構築するにはそれなりに高いスキルが求められる、奥の深い言語にもなっている。
特に今日ではWebとの親和性を重視した、htmlに特化した言語となってきており、色々な機能が盛り込まれてきている。
PHPにもフレームワークがあり種類が非常に多い。今日日本を含め、世界で一番人気があるのはLaravelであるが、世界では他にアメリカや東南アジアで根強い人気を誇るCodeIgniter、フランスで生まれ、ヨーロッパで主流のSymfonyなどのシェアが高い。ほかに、日本などで根強い人気を誇るCakePHP、オランダで生まれ、ベネルクス三国やドイツなどで根強い人気を誇るZendframework、中国で生まれロシアで人気が高いYiiのシェアが高く、ほかにPhalcon、fuelPHPなどがある。
また、世界で最も愛用されているCMSの一つ、WordPressはPHPを主としている。
サーバーサイドスクリプティング
ブラウザがURLからPHPファイルを要求されると、Webサーバー上で要求されたスクリプトを実行し、その結果をHTMLの内容などでブラウザに出力する。この仕組みのことをサーバーサイドスクリプティングと呼び、それらに属するプログラミング言語をサーバーサイドスクリプティング言語と呼ぶ。
あくまでもスクリプトの実行はサーバーで行うため、利用するブラウザを選ばないという特徴がある。
これに対し、JavaScriptやVBscriptなどは、ブラウザでプログラムが実行されるため、サーバーサイドスクリプティングに対してクライアントサイドスクリプティングと呼ぶ。
PHPはHTMLドキュメント内にスクリプトを書く書式が一般的だが、中にはCakePHPやZend Frameworkのそれのように、PHPスクリプトがHTMLドキュメントを書き出す書式もある。
プログラム例
まずは、Hello Worldを出力してみる。PHPスクリプトは<?php ~ ?> の~の部分に記述する。
<html>
<head>
<title>Hello World!</title>
</head>
<body>
<?php
echo "Hello World!";
?>
</body>
</html>
PHPは変数の宣言および型の宣言が不要である。したがって数値をそのまま文字として出力することもできる。
以下は、変数$add1に変数$add2を加算して画面に出力するプログラムである。
この場合、画面には「2564」と表示される。
<html>
<head>
<title>変数の扱い</title>
</head>
<body>
<?php
$add1 = 2525;
$add2 = 39;
$add1 = $add1 + $add2;
echo "結果は".$add1."です";
?>
</body>
</html>
if,for,while,do while,switch,foreach
//1から100まで任意の値をランダムに取得し、奇数か偶数かを表示
$num = rand(1,100);
if($num % 2 == 0 ){
echo "{$num}は偶数です";
}elseif( $num % 2 == 1 ){
echo "{$num}"は奇数です。
}
//また、一行だけならこういう括弧を省略した記述もできる
if($num == 0 ) echo "0はどちらでもありません";
- for …順々に処理していく。一部の他言語のように一定間隔でループはできない。
//変数$xに対し、順々に累乗を出力していく
for($x = 0 ;$x < 10; $x++ ){
$square = pow($x); //pow()は冪乗を取得する関数
echo "{$x}の累乗は{$square}です";
}
- while …一定条件を満たすまで処理を繰り返す。
//一定の条件を満たすまで処理を繰り返す
$hp = 1000;
$hit = 0;
while($hp > 0){
$hp += rand(1,1000); //乱数で出た値だけ回復する
$hp -= rand(100,1000); //乱数で出た値だけ$hpが減る
$hit++;
}
echo "あなたは{$hit}回攻撃に耐えました";
- do while …while文と違い、最低1回の処理を行ってから処理を繰り返す。
//簡単なじゃんけんゲームをプログラム化したもの
$items = ["g" =>"グー","c" => "チョキ","p" => "パー"];
$p1 = ""; $p2 = "";
do{
$p1 = array_rand($items);
$p2 = array_rand($items);
}while( $p1 == $p2); //引き分けならもう一度繰り返す
$judge = $p1.$p2; //キーを連結し、判定用のフラグを作る
if($judge == "gc" || $judge == "cp" || $judge == "pg"){
echo "{$items[$p1]}でプレイヤー1の勝ちです";
}else{
echo "{$items[$p2]}でプレイヤー2の勝ちです";
}
switch( $area ){
case "Tokyo" : $phone = "03";
break;
case "Osaka": $phone = "06";
break;
default: $phone = "その他の番号";
}
echo ”あなたのお住まいの市外局番は{$phone}です”;
$central = [
["Giants","Tigers","Dragons"],
["Jabbit","Tolucky","Doara"],
];
foreach ($central as list( $team,$mascot) ){
echo "{$team}のマスコットは{$mascot}です\r\n";
}
オブジェクト指向
PHPはかつてオブジェクト指向を使えなかったが、バージョン3.0より使用できるようになっている。記述方法は以下の通りである。クラス指定はセオリーとして英大文字で記述し、メソッドをやりとりする、他言語のようなthisはアロー演算子を用いる。ここではあくまで基本だが、継承クラスやオーバーライド、抽象クラス、静的メソッド、インターフェース、名前空間、トレイトなども用意されている。
private $a;
private $b;
private $ans;//コンストラクタ
public function __construct($a,$b){
$this -> a = $a;
$this -> b = $a;
}
public function add(){
$a = $this -> a;
$b = $this -> b;
$ans = $a + $b;
$this -> ans = $ans;
}
public function getter(){
$ans = $this -> ans;
return $ans;
}}
$Math = new Math(3,4); //コンストラクタに値を代入
$Math -> add(); //計算用のメソッド
$answer = $Math -> getter(); //ゲッタで値を取得する
echo $answer; //7と表示される
データベースとの連携
PHP5.5以降はMySQLに接続するには従来のMySQLライブラリが非推奨(Ver5.5以降、Ver7では削除済)となっているため、mysqli クラスを使うか、PDO(PHP Data Objects)クラスを使うことが推奨されている。
<?php
try
{
//MySQLに接続
$dbh = new PDO("mysql:host=localhost","root","",array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_DEFAULT_FETCH_MODE => false ));
} catch (PDOException $e) {
echo $e->getMessage() or die();
}
?>
PHPは初心者向けなのか?
変数の型宣言が不要、関数で簡単に引数と戻り値を制御できるなど、サーバ設定の知識さえあれば初心者でも動かしやすい言語には数えられる(Xamppという初心者にも便利なローカルディストリビューションもシェア普及に一役買っている)。しかし、前述したようにそれだと冗長なコードになりやすいので、プロレベルで品質を保持するならば、色々と気をつけることが多い、玄人好みの言語といえる(世界では現場から嫌われている言語のワースト2になったそうだが、これも品質のバラツキが原因にある)。特に現場で開発に携わるなら、XSS対策、エンコード、プレースホルダあたりの知識は持っておいてほしいものである。
そして、大原則としてhtmlはあくまでデータの出力を行う場所であり、html側に処理を記述するのは好ましくない。初心者ほどhtml側に処理を書きたがるが、それは控えるべきである。
また、オブジェクト指向についてであるが、かつてPHPはオブジェクト指向を不要とすることを売りとしていた。しかし、時代が変遷し世間の趨勢に合わせ、今日ではPHPでもオブジェクト指向は基本的知識とする見方が強くなっている(それでもRubyやPythonといったガチガチの制約の言語と比較すればかなり制約は緩い)。
その他
ニコニコ動画はPHPで作られているほか、楽天などPHPを使っているWebサービスは多い。
あと、文法がPerlと似ている部分もあるが、根本的に違う点はPerlが後方互換性に優れているのに対し、PHPは常に流行をパクる採り入れる傾向にあり、古い記述をどんどん切り捨てている傾向がある。これはWEB上での利用者が多い反面、XSSやSQLインジェクション、CSRFなどセキュリティ的なリスクも多く背負っている言語なのも一因である。
近年はJavaScript、JavaのほかRuby(Rails)、Pythonをプログラム入門に選ぶ人も増えてきており、2018年における人気言語では4~7位と、いっときより幾分勢いは弱くなっている。しかし、初心者向けのウェブページ制作で人気の高いCMSであるWordPressやハイブリッドアプリ制作にも用いられるLaravel、cakePHPなどのフレームワークなど、まだまだPHPはWeb上で一定の地位を保っている。
よく使う予約関数
PHPの予約関数は1000以上はある。しかし、普段からよく使うのは200ほどであり、ある程度覚えておくだけで問題ないだろう。なお、PHPでは慣習的にhaystack(干し草)とneedle(針)というたとえを用いる。haystackはデータの集団の比喩、needleは検索対象の比喩であり、干し草の中から針を探すというニュアンスを意識しておくと公式マニュアルも参照しやすい。
- strpos() …文字数から任意の値を検索する。
- str_replace()・preg_replace() …任意の文字を置き換える。後者は正規表現を用いて置き換え
- preg_match() …正規表現を用いて、一定条件を満たす値か判定する
- mb_strlen()とstrlen() …文字数と文字バイト数を数える。
- strpos()とmb_strpos() …任意の文字列を探索する。
- count()…配列の要素数を数える。JavaScriptのarray.lengthと同じ働き。
- implode()とexplode()…配列を任意のデリミタで分割したり、文字列を任意のデリミタで配列化したりする。javascriptのjoinとsplitと同じ働き。
- array_unshift()とarray_push() …前者は配列の先頭、後者は配列の末尾に新たな値を挿入する。
- array_shift()とarray_pop() …前者は配列の先頭、後者は配列の末尾の値を取り除く。
- array_slice() …配列の任意の要素を抽出する。
- array_merge() …配列を結合させる。インデックスは振り直される。
関連動画
関連コミュニティ
関連項目
- 11
- 0pt