Warning: Invalid argument supplied for foreach() in /home/minamachijp/minamachi.jp/public_html/mnc/wp-content/themes/mnc/functions/menu.php on line 48

PHPの基本とCakephpについて〜

本日のアジェンダ

PHPの基本
PHPのインストール
PHPの記述方法について

CakePHPについて
HTMLヘルパー
ルーティングなど

PHPについて

PHPはインタープリター言語の一種です。JavaやC#に比べると遅いですが、スクリプト言語の中ではもっとも人気のあるプログラム言語の一つです。一般的にはApacheやNginxなどのWebサーバー上に配置してWEB開発言語としての側面が強いですが、Batch処理などコマンドから実行することも可能です。

PHPのバージョンはv5.6以降を使用することが推奨されます。V5.4以前はすでにサポートが終了しているため、推奨されません。これはセキュリティパッチを含めて提供されないことを意味しています。

インストール方法

Windowsの場合
PHP.NETからダウンロードする必要あり。Microsoft Web Platform Installerなどを利用してインストールすることも可能。
Macの場合
標準インストールされています。他のバージョンを使用する場合は別途homebrewなどを利用してインストールする必要あり。
Linuxの場合
Yum(CentOS),apt-get(Ubuntu,Debian)などでインストールする。特定のバージョンはremiなどのリポジトリを有効化する必要あり。

統合開発環境について
基本的にありません。ただ、PHPStormなどの製品があります。
オススメは無償のVisual Studio Codeです。こちらはデバッグ環境も簡単につくることができます。

PHPコマンドについて

ファイル名と文字コードについて
基本的にはindex.phpなどの.phpを使用します。
文字コードは特殊な例を除いてUTF-8を使用して記述します
PHPコマンドについて
PHPのコマンドにはいくつか便利な機能があります。

php -v
バージョン情報を表示します
php -a
インタラクティブモードに変更します。ここでスクリプトを実行することができます。(Windowsではうまく動作しません)
php –ini
php.iniファイルの場所を表示します。

PHPの制御ファイルについて

PHPの制御ファイルについて
環境によって異なるが、制御ファイル(.ini)を必ず変更する必要があるので注意。
最低限書き換える必要があるもの
date.timezone = “Asia/Tokyo”
upload_max_filesize
post_max_size
memory_limit
実際にどのように読み込まれているかは
以下の関数で確認できる
phpinfo()

基本的なPHPの記述方法について

以下のような形で記述していきます。

See sample1.php
コメントについて
コメントの書き方は以下の通り
See sample2.php

変数宣言の方法について

変数には頭に$をつけることで変数とみなします。
PHPの場合は型がありません。実行時に格納されるオブジェクトによって内部的に型が定義されます。

$name = “田中太郎”;
$old = 20;

文字列はダブルクォートもしくはシングルクォートを使用します。厳密には違いますが、今はあまり気にしなくて構いません。
変数の型を知りたい場合は、gettype関数を使用します。

文字列の結合について
C#などは+で結合を行なっていきますが、PHPの場合は.で結合処理を行います。

変数の初期化と定数について

nullについて
変数を初期化する際には基本的にnullを代入します。

$name = “山田太郎”;
$name = null;
echo $name;
定数について(See sample3.php)
PHPではdefineを使用するのが一般的です。
アプリケーション内でグローバルに使用したいものなどを定数としてまとめることが多々あります。定数を使用する場合は$をつけずに使用します。

define(“TITLE”, “タイトル”);
echo TITLE;

制御構文の色々

if文
一般的なif文の記述スタイルとなっています。
判定を行い、真偽によって処理を分岐するために使用します。
switch文
値に一致した場合に処理を行う場合に使用します。
基本的にif文でも記述できます。

論理演算子については知っておくこと

&&
A && B
aとbがともにtrueの場合、ifブロックに入る
||
A || B
aとbの少なくとも一つがtrueの際にifブロックに入る
!
!A
aがtrueの場合にfalse, falseの場合にtrueとして動作する。

methodについて

Methodとは 意味や内容がまとまっている処理や、繰り返し現れる処理を、ひとつのグループとしてまとめたもの。
PHPの場合、functionという形で記述していきます。

配列とstdClassについて

多くのデータを格納するために使用されます。
配列とstdClass(標準クラス)は非常に利用頻度が高いです。
また、PHPでは連想配列もよく利用するので自分で様々な形で作成してみてください。

繰り返し処理について

for文、foreach文は配列操作で頻繁に使用します。
while文もありますが、基本的には使用しない方が賢明です。(よく無限ループしてしまうため)
※whileはDBやテキストファイルを読み込む際などしか使用しません。
主に配列とセットで使用することが多い。

Classについて

ラスは最も基本的なオブジェクトになります。
なんらかの処理をまとめたり、入れ物のように使用することがあります。

private自分のクラスのみから参照可能
protected自分のクラスと継承先からのみ参照可能
publicどのクラスからでも参照可能

Namespace(名前空間)について

namespaceは非常に便利なものになります。PHP5.3以降に誕生した機能です。
最初はあまり意識しないかもしれませんが、同一の名称のクラスをロードするために必要不可欠な仕組みです。LaravelやCakePHPなどのフレームワークではcomposerなどと合わせて使用するため、拡張性を意識した作りになっており、その際にはこの機構が必須となっています。

namespace App¥Emp;

使用するときは
use App¥Emp;
などというように使用します。

パッケージ管理ツールについて

最近はどのプログラム言語でもパッケージ管理ツールが提供されています。
Ex)NodeJSのnpmのようなもの

PHPの場合は有名なところでは以下の2つが存在します。

PEAR昔からあるパッケージ管理ツールです。環境によってはroot権限が要求されるため、最近はあまり利用されません。
Composer現在主流のパッケージ管理ツールです。PHP5.4以降で動作します。依存関係を制御してくれるため、非常に有用なツールです。

Namespace(Cakephpについて

Cake PHPは昔から開発が進められているMVC型のフレームワークです。
名前の通り、PHPでの開発を簡単に実装できるようにしたフレームワークになります。
主に中規模以上のRDB(リレーショナルデータベース)の開発で使用されます。
2016.12現在、CakePHPは3系が主流となっています。

RDBの代表的なものとしては
MySQL(MariaDB)
PostgreSQL
があります。

CakephpのMVCについて

M(モデル)
モデルはアプリケーションが扱うデータへのアクセスを担当する。
データーベースに対する処理やそれ以外の計算や処理をモデルの中に実装し、コントローラーやビューにその結果を提供する。

V(View)
Viewはユーザーに対する見た目の部分を担当します。
基本的にHTMLやJavascriptを記述していきます。
CakePHPの場合は、.ctpファイルに記述していくことになります。
コントローラーから渡された値をもとに表示するだけに留めるべきです。
こちら側でビジネスロジックを組んでいくことも可能ですが、多くの場合煩雑になります。

C(コントローラー)
ユーザーからの入力を受け取って処理を行う部分。
ユーザーからの入力に応じてモデルを呼び出し、その結果をViewに渡して表示する「司令塔」の役割。

CakephpのHTMLヘルパーについて

Viewを記述する際にはできるだけHTMLヘルパーを使用するほうが安全です。
よく使うもの
FormHelper::create(string $model = null, array $options = array())
FormHelper::end($options = null, $secureAttributes = array())
HtmlHelper::link(string $title, mixed $url = null, array $options = array())
HtmlHelper::url(mixed $url = NULL, boolean $full = false)
使用する際には
echo $this->Form->create(‘User’, array(‘action’ => ‘login’));
echo $this->Form->end();
echo $this->Html->link(‘Enter’,’/pages/home’,array(‘class’ => ‘button’, ‘target’ => ‘_blank’));

ルーティングについて

基本的には標準機能を使用した方が懸命です
Config\routes.phpに追加していくことで変更が可能

Router::connect(‘/’, array(‘controller’ => ‘schedules’, ‘action’ => ‘display’));
Router::connect(‘/schedules/show/*’,array(‘controller’ => ‘schedules’, ‘action’ => ‘index’));
/を上記のように変更しておかないと、下の修正が効かない場合があります。

通常URLにパラメータが埋まりますが、クエリ文字列にしていくことも可能です。(ただし、あまり推奨しません。)
$url_prev = $this->Html->link(‘前週’, array(‘controller’ => ‘schedules’, ‘action’ => ‘index’, ‘?’ => array(‘set_year’ => $prevWeek[“year”],’set_month’ => $prevWeek[“month”], ‘set_day’ => $prevWeek[“day”])), array(‘title’=>’前週へ’));
$url_next = $this->Html->link(‘次週’, array(‘controller’ => ‘schedules’, ‘action’ => ‘index’, $nextWeek[“year”],$nextWeek[“month”], $nextWeek[“day”]), array(‘title’=>’次週へ’));

ルーティングについて

基本的には標準機能を使用した方が懸命です
Config\routes.phpに追加していくことで変更が可能

Router::connect(‘/’, array(‘controller’ => ‘schedules’, ‘action’ => ‘display’));
Router::connect(‘/schedules/show/*’,array(‘controller’ => ‘schedules’, ‘action’ => ‘index’));
/を上記のように変更しておかないと、下の修正が効かない場合があります。

通常URLにパラメータが埋まりますが、クエリ文字列にしていくことも可能です。(ただし、あまり推奨しません。)
$url_prev = $this->Html->link(‘前週’, array(‘controller’ => ‘schedules’, ‘action’ => ‘index’, ‘?’ => array(‘set_year’ => $prevWeek[“year”],’set_month’ => $prevWeek[“month”], ‘set_day’ => $prevWeek[“day”])), array(‘title’=>’前週へ’));
$url_next = $this->Html->link(‘次週’, array(‘controller’ => ‘schedules’, ‘action’ => ‘index’, $nextWeek[“year”],$nextWeek[“month”], $nextWeek[“day”]), array(‘title’=>’次週へ’));

コントローラーでやること

public $uses
使用するモデル名を定義
public $components
使用するコンポーネント名を定義
PaginatorやSessionなど

別なViewを使用する場合
$this->render(‘index’)

その他の情報はこちら
http://book.cakephp.org/2.0/ja/contents.html

PEARのCalendarについて

最初にインポートを実行する必要あり
App::import(‘Vendor’, ‘Calendar_Week’, array(‘file’ => ‘PEAR’ . DS . ‘Calendar’ . DS . ‘Week.php’));
普通にrequire_onceなどを使用しても問題ありません。

$w = new Calendar_Week($set_year, $set_month, $display_day);
$w->build();
$aWeek = $w->fetchAll();
それぞれ何が格納されているのか、var_dumpなどを使用してみてみるとよいでしょう。

TOP
TOP