2016年12月23日金曜日

初めてのPHP


周りでPHPを始めた人がいたので、自分も乗っかってみました。
まずはドットインストールから入り、適当な書籍に移っていこうと思います。
ドットインストールのPHP入門講座を見てみたり、paizaでレベルDの超簡単な問題をPHPで書いたり、ドキュメントをググったりして得た気づきをリストアップします。



環境

  • 概要:MacOSにvagrant + virtual BOXでcent osを載っけてPHP5
  • Host OS: MacOS El Capitan 10.11.6
  • Guest OS:centos 6.6
  • PHP: 5.6.29
  • Vagrant: 1.9.1
  • Virtual Box:5.1.12



気づき

PHPの由来
SlideShare PHP基礎勉強会より引用
Hypertext Preprocessor(ハイパーテキストプリプロセッサー)
元々PHPは「Personal Home Page」(パーソナルホームページ)の略でしたが、1998年にリリースされたPHP3から意味が変更されました。

コメント
1行コメントは // , # どっちもいける
複数行は /* */

文末は;セミコロン
そのまんま

閉じタグ
PHPしか書かない時は、<?phpの閉じタグ(?>)は書かなくていい

php? PHP?
ロゴは小文字ですが、公式サイトの文章内ではPHPと大文字でした

ビルドインサーバを実行できる
ドキュメントルートに移動して、「php -S 192.168.33.10:8000」
アクセスログやエラーログが標準出力される。

メソッド名間違えただけでも HTTP Response Statusが500 Internal Server Errorになるみたい
試しにechoメソッドをechooにしてみてから、そのファイルにアクセスしたところ、
500 Internal Server Errorとなった。
テンプレートエンジンとは違い、シビアですね。

ログはわかりやすい。
[Fri Dec 23 10:59:32 2016] 192.168.33.1:59552 [500]:
 / - syntax error, unexpected '"hello from the TOP!"'
 (T_CONSTANT_ENCAPSED_STRING) in /home/vagrant/php_lessons/index.php on line 8
実際のindex.phpの8行目
 echoo "hello from the TOP!";

変数
変数の宣言およびアクセスは「$変数名」
アクセスする際は、「{$変数名}」も可
宣言に「$」をつけることを除けばシェルスクリプトと同じ。
動的型付け言語。変数宣言時に型の指定が不要。
perlみたいに条件判定は柔軟に行えるかな?

var_dump(変数)
変数の型を取得する

 $msg = "hello from the TOP!";
 var_dump($msg);

string(19) "hello from the TOP!"

定数
defineメソッドで定義する。
define(定数名, 値);

また、アプリケーションが持つ定数がある。
__LINE__(行数), __FILE__(ファイル名), __DIR__(ディレクトリ名)

**
PHP5.6からはべき乗の演算子が使える。
Javaだとpow()関数ですね。

単項演算子
インクリメントは前置も後置も対応している。
x++
++x

""'(ダブルクォート) , ''(シングルクォート)の文字列の扱いの違い
シェルスクリプトなんかと同じですが、""は変数を展開します。
一方、''は変数を展開せず、入力した値の通りに扱います。
また、特殊文字(\t, \n)も同じように""だと展開される。

文字列の連結
.(ドット)でつなげる。ここはperlと同じ。
.=(複合代入演算子)も大丈夫。

エルスイフはelseif
ここの表記は言語間で統一してくれ...

==, ===
JSでよく話題に上がるアレ
===だと型まで判定に含めるので、数値の1と文字列の1は別。
==だと数値の1も文字列の1も同じだと見なす。
Javaだと型を変換する必要があり面倒くさいから、ここら辺はPHPだと助かる。

標準入力
fgets(STDIN)で標準入力を取得できます。

False
文字列:空、"0"
数値: 0、0.0
論理値:false
配列: 要素の数がゼロ
null

True
文字列:(空、"0")以外
数値: (0、0.0)以外
論理値:true
配列: 要素の数が1以上

SWITCH句
文字列で分岐できる!
Javaじゃできん。

DO-WHILEだけ;が必要
CもJavaもPHPも、while句では;いらないけど、
do-whileだと;が必要なんですね。。。

連想配列と一般的な配列の区切りが少ない?
一般的な配列も、keyをゼロから連番で振っている連想配列だと考えることもできると気づきました。
要素の値を取り出す際は、配列名[添字またはkey名]

foreach ($arrays as $key => $value) { }
配列のkey-valueを取り出せる。
Java : for (int seiseki: data){ }
Javaだとオブジェクトも取り出せますね。
一方、PHPはオブジェクト取り出せないように見えますが、keyとvalueの取り出しがわかりやすい。
またPHPのforeachは、次のようにも書ける。
foreach ($colors as $values) :
  echo "$values\n";
endforeach;

function
JSか。。。
引数の初期値を設定できるのは斬新
function greet($word = "Hi"){ }
また、PHPは動的型付けなので、関数の戻り値も設定しないんですね。

スコープ
スコープ外の変数にアクセスしてもnullとなるだけ。
Javaみたいに例外でプログラムが止まったりしない。楽ですね。
まぁ見つけづらくなるというデメリットがありますが。

try-catch-finally句
PHP5.5以降でfinally対応。




セッション関連

ドットインストールやQiitaの記事( Cookieとセッションをちゃんと理解する )を参照しました。

クッキー

ブラウザが持つ
そのため改ざんが比較的容易
大きなデータは持てない

PHPセッション

HTTPセッションと紛らわしい。。。
サーバが持つ
そのため改ざんが比較的困難
大きなデータも持てる
$_SERVER['REQUEST_METHOD']
HTTP REQUESTの種類を取り出す

$_POST['パラメータ名']
bodyに含まれるパラメータの値を取り出す

htmlspecialchars(文字列, ENT_QUOTES, 文字コードを示す文字列)
文字列のエスケープ

setcookie("username", "hoge");
クッキーを保存する
同じブラウザの違うタブでもアクセスできる
第3引数に有効期間を設定できる(デフォルトはブラウザを閉じるまで)

$_COOKIE['キー']
クッキーを取り出す

session_start();
HTTPセッションをまたぐパラメータのやり取りを可能にする。
このsession_startのセッション(区別のため「PHPセッション」と呼ぶべきか)の
スコープ(生存期間)がよくわかっていない。

$_SESSION['パラメータ名']
HTTPセッション間でのパラメータ

unset($_SESSIN['パラメータ名'])
HTTPセッション間でのパラメータを破棄するメソッド




関数リスト

echo ""
文字列の出力

ceil($int);
切り捨て

floor($int);
切り上げ

round($int);
四捨五入

rand(1, 6);
引数1から、引数2までの整数をランダムに取得

strlen($str);
文字列の長さを返す
strlen(ネコ)が6で返ってきたので、びっくり。
全角文字は絶対2バイトだと勘違いしていましたが、調べたところ、UTF-8だと1-6バイトのいずれかになるらしいです。

mb_strlen($str);
マルチバイト文字の文字列の長さを返す
mb_strlen(ネコ)は2です。
第2引数に文字コードを明記できます。

printf
お馴染みのフォーマット指定の出力

count(配列名)
要素の数を返す

implode("文字", 配列)
文字で、配列を連結した文字列を返す

explode("文字", 文字列);
implodeの逆
文字で、文字列を分割した配列を返す



クラスとインスタンス


だいたいJavaと同じっぽい。助かった。。。


コンストラクタ
__construct()と書く

メンバ
$this->変数と書く
※変数の前に$はつけない!

extends
継承。
Javaと同じく多重継承できない。
多重継承と同じ効果は、interfaceを通して実現する

final
子クラスで上書き不可を示す修飾子

public, protected, private, default
アクセス修飾子
privateは自クラスのみアクセス可、子クラスからもアクセス不可。
protectedは自クラスと子クラスからアクセス可。
publicはどこからでもアクセス可
公式ドキュメントには、「アクセス権 (visibility) 」と記載されている。
varを使ってプロパティを宣言した場合や、メソッドにアクセス権を明記しない場合は、public扱いです。

static
クラスをインスタンス化しないでアクセスできるようにする修飾子。
クラスメソッドの呼び出しは クラス名::メソッド()
クラスプロパティへのアクセスは、self::$プロパティ名

abstract
抽象クラスであることを示す修飾子




コードの分割

requireとrequire_onceの違いを調べてて、
PHPってインタプリタ言語なんだなって痛感しました。
Javaだとクラスファイルを書き分けるために、ソースコードを分ける場合がほとんどだと思います。
PHPだと、「一連の処理だけ別のファイルに書き出す」ってこともできるみたいです。
requireやincludeでファイルを読み込んだ時点で、その中の処理が実行される場合があるということです。
あと、「ファイルパスは絶対パスで書こう」意見を見つけました。
マコトのおもちゃ箱 ~ぼへぼへ自営業者の技術メモ~ 「PHP、require、includeする時の注意点。」
振り返ってみると、Javaのパッケージ読み込みはフルパスですね。
そういえば、PHPのIDEは何がpopularなのだろうか。。。
require
「君が絶対必要なんだ!」ということで、指定したファイルがなきゃ実行しない。(fatal error)

include
を含む。なかったら警告を出す。プログラムは止まらない。

require_once / include_once
同じファルは2回読み込まない。
アプリ全体でカウントするのか、特定の呼び出し元ファイル内だけでカウントするのかがわからない。
困った時に調べよう。

autoload
未定義のクラスについて、そのクラス名でファイルを探索して読み込む。
便利!

sql_autoload_register(function($class){
  require 
});
これで未定義のクラスについて、自動で読み込んでくれます。

クラスファイルを読み込み忘れた時
こんなエラーメッセージで怒られる。status 500。。。。
[Fri Dec 23 20:10:21 2016] 192.168.33.1:52369 [500]:
 / - Class 'User' not found in /home/vagrant/php_lessons/index.php on line 12

namespace hoge\Lib;
階層の区切りが\です。
<html>要素の中に書いたらダメ。
ファイルの冒頭にphpタグを入れて、その中に書く。

use 名前空間 as 別名;
名前空間に別名をつけることができる。



PHP IDEの考察

考察と言ってもググってTOP5の記事をブラウズしただけですが(^^;
自分が最も助かった記事はグーグル順位5位のこちらの記事でした。
BULBLUB WEBの仕事をしている建築士のブログ 「PHP向けIDEリスト[PHPSTORM, NETBEANS, APTANA STUDIO, ECLIPSE]」
個人的にEclipseを試してみます。
理由は2つあり、

  1. Javaでたまにお世話になっているので、UIに違和感がない
  2. 本当はPhpStromを使いたいが、メイン言語ではないPHPのIDEに$89は出せない
です

0 件のコメント:

コメントを投稿