あーる学習帳

自分が勉強したことや気になることなど

2018年6月18日の勉強

関西にお住まいの方、大丈夫でしょうか…。

 

自分は自分のことをやります。

仮想環境を整えて本で勉強しようとしていましたが、仮想環境が立ち上がらないわエラー吐くわで大変な目にあいました。

結局VagrantVirtualBoxは最新版を再インストール、Vagrant Upで起こっていた共有フォルダのマウントとれない問題はプラグインとなんか足りないとエラーで出ていたツール?ドライバ?の導入で事なきを得ました。

そもそものエラーは、Vagrant Upをしたときに

/sbin/mount.vboxsf: mounting failed with the error: No such device

というエラーを出しやがって起動がうまくいかないというもの。ホストと仮想マシンVirtualBoxのバージョンがずれていることから起こるエラーみたいです。これを解決するため、Vagrant Upをするフォルダまで移動した後に

vagrant plugin install vagrant-vbguest 

を実行。プラグインが入ってくるので、次は

vagrant vbguest

こうして ホストとゲストのバージョンを揃えます。自分の場合はこのあとに足りないツールがあったらしく、そちらのエラーも出していましたがググって解決しました(詳しい目もとるの忘れてた)。

テストで<?php echo "Hello"; ?>とだけ書いたphpファイルをビルトインサーバーを使って実行しようとしたら、PuTTYでこのようなエラーが出ました。

-bash: php: command not found

仮想マシンを立ち上げた!で終わっていたみたいで、アプリケーションのインストールも何もしていませんでした。笑

以下のコマンドをPuTTY仮想マシンにログインしてから実行していきます。

01.OSを最新の状態にアップデート

sudo yum -y update

02.スクリプトを入手するためのgitをインストール

sudo yum -y install git

03.gitを使ってアプリケーション設定用のスクリプトをダウンロード

git clone https://github.com/dotinstallers/centos6.git

04.centOS6フォルダができるので移動

cd centos6

05.スクリプト実行

./run.sh

06.設定反映

exec $shell -l

何も知らない仮想マシンを問い詰めるような真似をしてしまっていました。そりゃあphp -Sをやってもエラーになるわ。気になっているのは、今回も前回もドットインストールの方式で仮想環境の構築を行っている点。結局はスクリプトの中身や本来なら何が必要なのか、何をインストールしたのかを全く理解していないので、例えばMySQLを使って…となったら即座にアウトだと思う。

 

環境が整ったところで、勉強に進みたいと思います。今までやったことも結構あるので、知らなかったことや忘れていたことはまとめてセクションごとの練習問題を解いていく→章末の実習にじっくり取り組む方式でやります。

 

第3章ー02 練習問題

  1. 変数名は$place、代入する文字列は「北海道」とし、それを出力するプログラムを作成しなさい。
  2. 1.で作ったプログラムについて、「に行きたい」という文字列を連結して出力しなさい。

<?php

  $place = "北海道";

  echo $place;

  echo $place.'に行きたい'

f:id:R_de_aru:20180618232847p:plain

深夜だけど朝飯前さ! 文末の;(セミコロン)を忘れがちなので要注意。

文字列を連結するのには.(ドット)を使う。覚えておこう。

 

第3章ー04

<?php

  $x = 5; 

  $y = 7;

  echo $x + $y;

  echo $x * $y;

このコードを実行すると、ブラウザには「1235」と表示される。これは2つの式の答えが連なって出力されているため。改行して画面に出力するには以下のように書く。

 <?php

  $x = 5; 

  $y = 7;$x=400;

  echo $x + $y . '<br>';

  echo $x * $y;

htmlの改行タグを使い、ドットで連結して出力した。

第3章ー04 練習問題

  1. 下記のコードに追加して、次の課題を完成させよ。

$xは価格(400円)、$yは個数(6個)です。この場合の合計金額を消費税込みで表示してください。

<?php

  $x=400;

  $y=6;

<?php

  // 解答

  $x=400;

  $y=6;

  echo $x*1.08*$y.'円';

f:id:R_de_aru:20180618234306p:plain

些細なことですがドットインストールでやった基礎が使えているのを感じて嬉しい。

明日は第3章の実習、「送信フォームからデータを送信し、画面に表示する」という課題に取り組みます、楽しみ!!

今日はお休みです

お誘いをいただいたので「スタジオジブリ・レイアウト展」に行ってきました。

アニメのレイアウトとは、絵コンテと作画の間に作る設計図のようなものだとのこと。宮崎駿監督、高畑監督直筆のレイアウトがズラリでした。詳しい人ならあの場で暮らしたくもなるのではないでしょうか。

 

写真撮影OKだった歴代ポスターたち。

f:id:R_de_aru:20180618000325j:image
f:id:R_de_aru:20180618000236j:image
f:id:R_de_aru:20180618000338j:image
f:id:R_de_aru:20180618000229j:image
f:id:R_de_aru:20180618000334j:image
f:id:R_de_aru:20180618000217j:image

f:id:R_de_aru:20180618000350j:image
f:id:R_de_aru:20180618000329j:image
f:id:R_de_aru:20180618000252j:image
f:id:R_de_aru:20180618000244j:image
f:id:R_de_aru:20180618000232j:image
f:id:R_de_aru:20180618000309j:image
f:id:R_de_aru:20180618000314j:image
f:id:R_de_aru:20180618000306j:image
f:id:R_de_aru:20180618000302j:image
f:id:R_de_aru:20180618000317j:image
f:id:R_de_aru:20180618000248j:image
f:id:R_de_aru:20180618000221j:image
f:id:R_de_aru:20180618000241j:image
f:id:R_de_aru:20180618000343j:image
f:id:R_de_aru:20180618000225j:image
f:id:R_de_aru:20180618000321j:image

f:id:R_de_aru:20180618000404j:image

 

正直なところアニメは好きでも制作現場についてはほとんど知らなかったので、今どきは全部パソコンなんだろうなぁと思っていました。

最新作である「思い出のマーニー」まで一貫してレイアウトの手法を使って制作していたことにびっくり。特に今回は「千と千尋の神隠し」の資料が壁一面にあって見応えがありました。一枚のレイアウト用紙に描かれた情報量がものすごい。

9月17日まで開催されているとのことなので、ご興味のある方はぜひ!圧倒されます!

 

2018年6月16日の勉強

親戚の誕生日を祝ってきました。中学生でかいな…自分が小柄なのもあるけどとても大きい…!

 

今日から「PHP しっかり入門教室」という本を使って学習をしていきますが、その前に今までとは別の仮想環境を作ります。今日は仮想環境についての復習。

 

環境を構築するためのツール等について

現在は上記のものを使っています。使っているPCはWindows10 Pro 64bit_1709です。

 

新しい環境を作成する

    1. 新しいフォルダ(C:\study\PHP_Start)を作成
    2. CentOS用のフォルダをその中に作成(C:\study\PHP_Start\CentOS)
    3. PowerShellでcdコマンドを使ってCentOSフォルダまで移動
    4. vagrant init bento/centos-6.8」コマンドで仮想マシン用のVagrantファイルを作成
    5. Vagrantファイルを開き、IPを設定している行をコメントアウトの状態から元に戻す。今回はIPを192.168.33.20とする(昨日までの学習で使った仮想環境とIP重複を避けるため)。今回コメントアウトから戻す行は「config.vm.network "private_network", ip: "192.168.33.10"」の部分であり、ここのIPを変更する。
    6. Vagrantファイルの設定を変更した後、「vagrant status」コマンドをPowerShellで実行して状態を確認。やってみたところ、まだVirtualBoxが起動していないというようなメッセージが出た。「起動していませんよ」という注意くらいで、エラーではなさそう。
    7. Vagrant Up」コマンドを実行して仮想マシンを起動(初回はいろいろな設定をダウンロードしたりしているらしく、結構時間がかかる)。今回はエラーが出た(エラーは以下に記載)が、これは前回でも出たファイル共有に関する鰓ー。学習そのものには今のところ影響はなさそうなので無視。前のときは放置していたが、PCを再起動しているうちに出なくなった。
    8. この状態で再度「Vagrant status」を実行すると「仮想マシンは起動しています」という旨のメッセージが出る。
    9. PuTTYでこの仮想マシンにログインする。先ほど設定したIP:192.168.33.20を入力してOpenする。なお、ここでPuTTY側にIPを覚えさせておくことも可能。
    10. PuTTYのプロンプトが開いたら、ユーザー名もパスワードも「vagrant」でログイン。
    11. Cyberduckでもこの仮想マシンへログイン。ツールバーの「ファイル>新規接続」で仮想マシンIPと手順10で使ったユーザー名、パスワードを設定。なお、ログインに成功した後にツールバーの「ブックマーク>新規ブックマーク」でこの情報を保存できる。
    12. 仮想環境構築はこれで終了なので、Cyberduckからフォルダやphpファイルを作って学習を進める

手順7のエラー

Vagrant was unable to mount VirtualBox shared folders. This is usually
because the filesystem "vboxsf" is not available. This filesystem is
made available via the VirtualBox Guest Additions and kernel module.
Please verify that these guest additions are properly installed in the
guest. This is not a bug in Vagrant and is usually caused by a faulty
Vagrant box. For context, the command attempted was:

mount -t vboxsf -o uid=500,gid=500 vagrant /vagrant

The error output from the command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device

手順8のメッセージ

Current machine states:

default running (virtualbox)

The VM is running. To stop this VM, you can run `vagrant halt` to
shut it down forcefully, or you can run `vagrant suspend` to simply
suspend the virtual machine. In either case, to restart it again,
simply run `vagrant up`.

 

お酒を飲んでしまっていて勉強が頭に入りそうにないので、今夜はここまで。

以前と同じように、仮想環境ログイン/ログアウト手順のうちPowerShellで行う部分についてはbatファイルを別途作成するものとする。

弱いのにお酒なんて飲むから…。

明日からの勉強について

先ほどドットインストールのPHP入門がすべて終わり、達成感に浸っております。

もちろんこれだけでPHPのすべてが分かったわけではなく、むしろやっとスタートラインに立つか立たないかのところだと思っています。まだまだ勉強、まだまだこれから。

 

というわけで、明日からは「PHP しっかり入門教室(著:小原隆義 翔泳社)」を使って勉強しようと思います。

先週買っていた本なのですが、

  • ドットインストールでやった内容の復習ができる
  • 各省のまとめとして、実習形式で実際に画面や機能を作れる
  • Gitのことも勉強したかったところで、この本ならGitにも少し触れている

というのが主な理由です。

今までのようなドットインストール議事録みたいな形式ではなく、(内容はかなり重複すると思いますが)自分なりにブログにまとめていきます。

この本では仮想環境をXAMPPで構築しているようですが、自分は今まで通りVirtualBoxVagrantでやっていく予定です。何かツールや機能が必要になれば、じっくり時間をかけてその部分も組み立てていきます。

 

ということで、今夜は本当にここまで。明日からも頑張るぞ。

2018年6月15日の勉強

今日も頑張るぞ。

 

#27

例外処理について。

何らかの処理をしていて予期しない結果が発生したとき、適切に処理をしていく方法のことである。

function div($a,$b){

  echo $a / $b ;

 $aを$bで割った答えを表示させる。

div(7,2);

div(5,0); 

0除算はできない。こういう意地悪をするとどうなるか。 

画面には7/2の解である3.5しか表示されない。このとき、サーバー側に「PHP Warning: Division by zero」というエラーが表示されている。

Warningを発生させず、代替となる処理を自分で作ることができる。上のコードを書き換え。

function div($a,$b){

  try{

    if ($b===0) {

      throw new exception("Cannot divide by 0 !!");

    }

    echo $a / $b ;

  } catch (Exception $e) {

    $e->getMessage();

  }

div(7,2);

div(5,0); 

こうすることで、「3.5」のあとに自分で決めたエラーメッセージ「Cannot divide by 0 !!」が表示される。サーバー側でもエラーが出ていない。

今回はおまじないのように列記しただけになったが、覚えておこう。

 

#28

フォームからのデータを継承しようという話。

まずはindex.phpにhtmlのコードを書き、名前の入力欄を作る。

<?php

 

?>

<!DOCTYPE html>
 <html lang="ja">
 <head>
  <meta charset="utf-8">
  <title>Check UserName</title>
 </head>
 <body>
  <form action="" method="POST">
   <input type="text" name="username" placeholder="user name">
   <input type="submit" value="Check!">
  </form>
 </body>
</html>

 f:id:R_de_aru:20180615214427p:plain

上のコードを入れるとこうなった。すごいぞhtml。

今回はPOST形式でusernameが渡ってくる。actionというところが空欄になっているので、他のファイルに渡すのではなくindex.php内で処理されるとのこと。

上のコードはphpのところが空白であり、html部分も書き換えが必要なので以下のようにする。

<?php

$username="";

if ($_SERVER['REQUWST_METHOD'] === 'POST'){

  $username=$_POST['username'];

  $err=false;

  if (strlen($username)>8){

    $err=true;

  }

}

?> 

 

<!DOCTYPE html>
 <html lang="ja">
 <head>
  <meta charset="utf-8">
  <title>Check UserName</title>
 </head>
 <body>
  <form action="" method="POST">
   <input type="text" name="username" placeholder="user name"

   values="<?php echo htmlspecialchars($username,ENT_QUOTES,'utf-8'); ?>">
   <input type="submit" value="Check!">

   <?php if ($err) { echo "TooLong!"; } ?>
  </form>
 </body>
</html>

$_SERVERという定義済みの変数について、REQUEST_METHODというものの値がPOSTだったら何かが投稿されたということになる。

$usernameという変数を定義するが、定義済み変数である$_POSTで名前を渡す。こうするとPOSTされた内容を$usernameに渡すことができる。

$usernameの文字の長さが8より大きければエラーを返すというようにしたい。$errという変数を初期値falseの状態であらかじめ作成しておき、8文字より大きいことがわかれば値をtrueにする。$errがTrueの場合、画面では「TooLong!!」と表示するようにする。

また、チェックボタンを押すたびに入力した値が消えてしまうので、htmlspecialcharsという設定方法を用いる(今回はおまじない扱いであまり触れないが、これを使うと$usernameに入れた値が初期値として維持される)。

この状態で「2222」と入力すると…

f:id:R_de_aru:20180615220851p:plain

画面には特別な表示などでないが、サーバーでもエラーが出ていないので処理は成功。

次に「2222abcdefg」と入力すると…

f:id:R_de_aru:20180615220945p:plain

このように、「Too Long!!」と表示される。

定義済みの変数やエスケープ(htmlspecialcharsのこと?)についても覚えておこう。

 

#29

Cookieについて。

アクセスしてきたユーザーのブラウザにデータをセットすることができる。

以下のコードを作成。

setCookie("username","yamada") ;

これで実行するとクッキーがセットされたことになる。

次回以降の実行の際には、usernameというキーでyamadaという値(Value)を持つようになる。以下のようにすると、値の確認ができる。

// 今回はsetCookieは外しておく

// setCookie("username","yamada"); 

echo $_COOKIE['username'];

これで実行すると、画面には「yamada」と表示される。この値についてはphpではなくブラウザそのものに保存されるので、別ファイルからも呼び出すことが可能。

試しにtestcookie.phpという別ファイルを作成し、上のecho部分だけを書いて呼び出すと…

f:id:R_de_aru:20180615222151p:plain

このように、yamadaと表示される(さらっと別ファイルを呼ぶ方法もやっちゃった)。

複数のページにわたって値を持ちたいときに有効。

また、setCookieには第3引数として有効期限をつけることができる。

setCookie("username","yamada",time()+60*60);

こうすることで、関数time()で取得した現在日時に60秒×60=1時間の起源を持たせることになる。期限を明示的に設定しない場合の有効期限は「ブラウザを閉じるまで」となるので注意。

また、クッキーを削除する場合は第3引数に過去の日時を与えればよい。

setCookie("username","yamada",time()-60*60); 

こうすることで、「現在の1時間前=過去」となりクッキーが削除される。

 

#30

セッションを使ってみようという話。

クッキーと同じようにデータを保存する仕組みだが、こちらはブラウザではなくサーバーにデータを保存する仕組みである。

セッションを始める場合は必ず以下のおまじないを書く。

session_start(); 

そして今回はコードを以下のように書く。

session_start();

$_SESSION['username']="yamada";

定義済みの変数である$_SESSIONについて、usernameというキーに対してyamadaという値を持たせる。この状態で実行すると$_SESSIONにyamadaという値がセットされ、次回以降は$_SESSION['username']でyamadaを出すことができる。

session_start();

echo $_SESSION['username'];

クッキーと同じようにサーバーでデータを保存しているので、他のファイルからも呼び出すことができる。testsession.phpというファイルを作り、session_startとechoを書くと…

session_start();

echo $_SESSION['username'];

f:id:R_de_aru:20180615230315p:plain

このように表示される。別ファイルでも必ずsession_startを書くこと。

セッションの削除については以下のように書く。

session_start();

unset($_SESSION['username']);

これで実行するとusernameが消える。なお、このあとにechoでusernameを出そうとするとサーバーでは「PHP Notice: Undefined index: username」という注意書きが出る。usernameなんか知らんがなという意味(画面は真っ白)。

クッキーとセッションをうまく使い分けられるようにしよう。

クッキーは気軽に使える一方、ブラウザ側にデータを保存するので改ざんの可能性ややろうと思えば中身が見えてしまうという危険性も持っている。

セッションはサーバーにデータを保存するので大きなデータを保存できる上、改ざんされにくい、中身が見られないという特徴がある。

 

今回でドットインストールのPHP入門、全30回を終えました!!!!

特に後半はおまじない要素が増えてきていたのでしんどいところもありましたが、別の教材で復習や発展的な学習を進めていこうと思います。

お疲れ様自分!!!!

2018年6月14日の勉強

スプラトゥーン2の追加コンテンツ「オクト・エキスパンション」をやりたいがために早々と帰宅しましたが、そんな日でも勉強を欠かさない大人の鑑です。

www.nintendo.co.jp

 

今日も学ぶぜ。

#23

抽象クラスについて。抽象的な話になりそう…。

抽象クラスとは、他のクラスで継承してもらうことを前提としたクラスのこと。ここからインスタンスを作成することはできない。

abstract class BaseUser {

  public $name;

  abstract public function sayHi();

}

class User extends BaseUser {

  

}

このように、abstractというワードで抽象クラスであることを宣言する。

この例のsayHiメソッドは「このクラスを親とする子クラス(継承先のクラス)で必ずsayHiメソッドを実装してください」という意味になる。この時点ではまだ中身は決まっておらず、子クラスで決められるものになる。これを抽象メソッドという。

この例ではUserクラスがBaseUserの子クラスとなるが、UserでsayHiメソッドが定義されていない。この状態で実行しようとすると、ビルトインサーバー側で「Class User contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (BaseUser::sayHi)」というエラーを吐く。ごめんね。

抽象メソッドを子クラスで実装する際は親クラスのアクセス権やメソッド名、引数を必ず引き継がなければならないことに注意。

抽象クラスを使えば子クラスをシンプルにできたり、実装の漏れを防ぐことができる。

 

#24

インターフェース(interface)を使ってみようというお話。

インターフェースとは、「このクラスではこのメソッドを必ず実装してください」というルールを定義するための仕組みである。

interface sayHi {

  public function sayHi();

interface sayHello{

  public function sayHello();

class User Implements sayHi, sayHello{

 

}

インターフェースの特性上、メソッドのアクセス権は必ずpublicになるので注意。

また、メソッドの中身は実装するクラスで書くので、ここではメソッド名だけでよい。

このインターフェースを適用するクラスには、クラス名の後にImplementsと書き、その後ろにインターフェースの名前を書く(複数指定もカンマで区切れば可能)。

この状態で実行しようとすると、「Class User contains 2 abstract methods and must therefore be declared abstract or implement the remaining methods (sayHi::sayHi, sayHello::sayHello)」というエラーが出る。ごめんってば。

抽象クラスとインターフェースは似ているが、

  • 抽象クラスではプロパティやメソッドの定義ができる。1つしか継承できない。
  • インターフェースではできない(必ず実装するというメモ的な?)。複数実装できる。

という違いがある。

 

#25

外部ファイルを読み込んでみようというお話。

開発規模が大きくなればファイルを分割して保存することもあるので、今回はその方法を学ぶ。

class User {

  public $name;

  public function __construct($name){

    $this->name=$name;

  }

   public function sayHi() {

    echo "Hi,I am $this->name!";

  }

}

$bob=new User("bob");

$bob->sayHi();

このコードのUserクラスを宣言している部分(1~9行目)を別のファイルに保存する。

今まで使っていたindex.phpと同じフォルダに「User.class.php」というファイルを作成し、上記のクラス部分をコピペする(User.class.php側で<?phpをつけるのを忘れない)。

今回はindex.phpからUser.class.phpを呼び出したい。方法としては、

  • require
  • require_once
  • include
  • include_once
  • autoload

という5つの仕組みがある。なお、autoloadはクラスでのみ使える方法である。

requireもincludeも、それを書いた箇所に別ファイルを読み込む命令である。これらには以下の違いがある。

  • require:エラー発生時にfatal errorを発生させ、その場で処理が終了する
  • include:エラー発生時にwarningを発生させ、処理を続行する

requireとrequire_once、includeとinclude_onceの違いについて、_onceがついている方はPHPが自動的にそのファイルが読み込まれているかをチェックし、既に読み込まれている場合はその箇所での読み込みをスキップするというもの。

今回はrequireを使い、index.phpをこのように書き換える。

require "User.class.php";

$bob=new User("bob");

$bob->sayHi();

 こうすることでUser.class.phpの内容が読み込まれるので、処理が正常に通る(画面に「Hi,I am bob!」と表示される)。

autoloadについてだが、クラスが未定義だった場合に自動的に実行される仕組みである。今回の例ではindex.php側で以下のように書くが、今のところおまじないみたいに思っておけばいいとのこと。

 spl_autoload_register(function($class) {

  require $class . ".class.php";

});

$bob=new User("bob");

$bob->sayHi();

 これでうまく処理が通る。不思議。

 

#26

名前空間を使ってみようという話。

別ファイルを複数読み込んだ時、クラス名がかぶってしまうと問題になる。そのためにも、自分が作った関数、クラス、インターフェースには名前空間をつけて重複しないようにする。

今回はUser.Class.phpを以下のようにする。

namespace Dotinstall\lib;

class User {

  public $name;

  public function __construct($name){

    $this->name=$name;

  }

   public function sayHi() {

    echo "Hi,I am $this->name!";

  }

}

namespace (名前空間の名称)とすれば宣言できる。名前空間フォルダのように階層分けできるので、その際にはバックスラッシュをつけて深い階層の名前を書いて…の繰り返しになる。namespaceは必ずファイルの先頭に書くことがルール。

この名前空間を生かすには、index.phpを以下のように書き換える。

require "User.class.php";

$bob=new Dotinstall\lib\User("bob");

$bob->sayHi();

どの名前空間に属するクラスなのかを明示する形となる。なお、User.class.php名前空間を宣言したがindex.php側でそれを書いていない場合はエラーになるので注意。名前空間を使うなら両方とも書くこと。

階層のように管理していくと名前空間の名前がやたら長くなってしまう。それを防ぐために別名をつけることが可能。index.php側を以下のようにする。

require "User.class.php";

use Dotinstall\lib as lib;

$bob=new lib\User("bob");

$bob->sayHi();

use (名前空間の名前) as (別名)という形で宣言し、以降は別名が使える。別名の宣言の方法には別の方法もあり、

use Dotinstall\lib;

このようにuseの部分を書き換えることで、階層の最後となる名前をそのまま名前空間の略称として用いる。

他の人が開発したライブラリを使うときなどによく見るらしいので覚えておこう。

 

今夜の勉強はここまでで、明日にはドットインストールのPHP入門編が終了する予定です。そのあとはPHPの本を買っているので、それに載っている作品例を作りながら今までの復習や発展的な学習に進みます。場合によってはJavascriptにも手を伸ばすかもしれない。何かオリジナルのWebサービスも作ってみたい。

 

さて、オクトやるぞー。

2018年6月13日の勉強

今日は早めに始める作戦。

昨日の終了時にVagrantの終了を忘れていたのか、Vagrant Upでエラーを吐くという現象がありました。

VagrantUpで起動失敗→VagrantHaltでいったん終了→VagrantUpをもう一回やったらVagrantは起動したので、終了を忘れるとこういうことになるんだという教訓にします。

 

#18

クラスとインスタンスのお話。

複雑な処理についてはクラス(class)インスタンス(instance)を使うことで実現していく。例えば、「user」というクラスを作る場合は以下のような図になる。

f:id:R_de_aru:20180613201640p:plain

正直今回の説明はわかりづらい…。

classでデータの構造を定義し、instanceを作成してそれをinstanceごとに使っていくという話らしい。instanceを定義するには「$Tom=new User("Tom")」という形で定義し、定義した先では「$Tom->name」や「$Tom->sayHi()」という形でclassのProperty(クラスが持つ変数)Method(クラスが持つ関数)が使えますとのこと。Constructorというものもあるが今回は触れない。

あとはやりながら感覚を掴むしかなさそう…。全部英語で書いたけど、今後は普通にクラスやインスタンスとして表記していきます。最初くらいはちゃんとしたかったので。

この図を作るのには以下のサイトが役に立った。Web上でフローチャートを作るサイト、無料なのでぜひ。

Flowchart Maker & Online Diagram Software

 

#19

今回はクラスを作成する。

今回は下記のようにコードを作成し、userクラスを作る。

class User {

  // この中にプロパティ、コンストラクター、メソッドを定義

  // Property

  public $name;

  // Constractor

  public function __construct($name){

    $this->name = $name;

  }

  // Method

  public function sayHi() {

    echo "Hi,I am $this->name!";

  }

}

クラス名は必ず先頭が大文字になる。

インストラクターがなんとなくわかった気がする。インストラクターの名前は「__constuct」で固定らしい。最初は半角のアンダーバー2つ。constructの後のかっこに入れたクラス内の変数について、インスタンス側でその変数に値を入れるときにどのような形で呼ばれればその変数を使うかということらしい。感覚的だなぁとは思うけど、今はこのようなイメージ…。わかりやすい説明をまた探してみよう。

これでクラスができたので、インスタンスを作成して使ってみよう。

//(上のコードの続き)

$Tom =new User("Tom"); 

$Bob =new User("Bob"); 

$Tom->name;

$Bom->sayHi();

こうすると、画面には「TomHi,I am Bob!」と表示される。

 

#20

クラスの継承について。そういう単語だけは聞いたことがある(意味は知らない)。

これはあるクラスをもとにして新しいクラスを作るときに有効な手法だとのこと。

#19で作ったuserクラスを継承して新しいクラスを作る場合は以下のように書く。

class User{

  // #19と同じ内容

}

class AdminUser extends User{

  public function sayHello(){

    echo "Hello From Admin!";

  }

}

$steve = new AdminUser("Steve");

echo $steve->name;

$steve->sayHi();

$steve->sayHello();

これでAdminUserクラスもUserクラスで定義した$nameやsayHiが使えるようになる。

なお、AdminUserはUserクラスの派生なので子クラス、この場合のUserクラスを親クラスと呼ぶ。AdminUserクラス独自の変数や関数を作ることもできる。

また、子クラスの処理で親クラスのメソッドやプロパティを上書きすることも可能。オーバーライドというらしい。

class User{

  // #19と同じ内容

}

class AdminUser extends User{

  public function sayHello(){

    echo "Hello From Admin!";

  }

  // override

  public function sayHi(){

    echo "[Admin] Hi,I am $this->name!";

  }

}

$tom=new User("Tom");

$steve=new AdminUser("steve");

$tom->sayHi();

$steve->sayHi();

オーバーライドする場合は子クラス側で親と同じメソッド名を定義して別の処理を書けばOK。例ではtomとsteveはそれぞれUserとAdminUserに属するインスタンスだが、同じようにSayHiメソッドを使っても画面に表示される内容が変わることがわかる。

親クラス側で子クラスでのオーバーライドを禁止する方法もある。

class User {

 

  public $name;

  public function __construct($name){

    $this->name = $name;

  }

  final public function sayHi() {

    echo "Hi,I am $this->name!";

  }

}

メソッド名の前にfinalとつければオーバーライドを禁止することになる。 

上のように書き換えて実行しようとすると、ビルトインサーバーでは「cannot override」というエラーを吐く。

 

#21

プロパティやメソッドのアクセス権について。

今まで書いてきたpublicというワードがアクセス権を示すワードのひとつである。

アクセス権を示すワードには以下の種類がある。

  • private:そのクラス内からのみアクセス可能
  • protected:そのクラス内+親子クラスからアクセス可能
  • public:どこからでもアクセス可能

試しに以下のように書き換え。

class User {

  // public $name;

  private $name;

  public function __construct($name){

    $this->name = $name;

  }

  public function sayHi() {

    echo "Hi,I am $this->name!";

  }

}

class AdminUser extends User{

  public function sayHello(){

    echo "Hello From $this->name";

  }

}

$tom=new User("tom");

echo $tom->name;

この状態で最後のecho $tom->name;を実行するとエラーになる。ビルトインサーバー側では「Cannot access private property User::$name」とエラーを吐く。継承したクラスからも使えなくなる。

(上のコードに追加)

$steve=new AdminUser("steve");

$steve->sayHello(); 

こうすると画面には「Hello From 」しか出ない。ビルトインサーバー側ではエラーではないので実行そのものは可能だが、「Undefined property: AdminUser::$name」というメッセージが出る。

「継承したクラスからは使いたいがpublicにはしたくない…」というときにはprotectedを使えばよい。

安全なプログラムを書く際には必要不可欠な知識なので覚えておこう。

 

#22

staticを使おうという話。

インスタンスを作らなくても使えるプロパティやメソッドを定義する。

class User {

  public $name;

  public function __construct($name){

    $this->name = $name;

  }

  public function sayHi() {

    echo "Hi,I am $this->name!";

  }

  public static function getMessage(){

    echo "Hello From User Class!";

  }

}

User::getMessage();

アクセス権を示した後にstaticと書けばOK。 

インスタンスを作らないので、そのクラス独自のプロパティは使えないことに注意。

これにアクセスするには「(クラス名)::(メソッド名)」と書く。コロン2つ。

プロパティのstatic化についても例を作成。

class User {

  public $name;

  public static $count =0; //$countを初期化して0とする

  public function __construct($name){

    $this->name = $name;

    self::$count++; //インスタンス化されるたびにカウントが増える

  }

  public function sayHi() {

    echo "Hi,I am $this->name!";

  }

  public static function getMessage(){

    echo "Hello From User Class!";

  }

}

$tom=new User("tom");

$bob=new User("bob");

echo User::$count;

インスタンスが作成されるたびにカウントしていくプログラムになる。

クラスの中のstaticで定義したプロパティやメソッドを呼び出したい場合はselfというワードを使う。この場合、画面には2回インスタンスを作ったので2と表示される。

 

今夜はここまで。どうもインストラクターの理解がしっくりこない…。