20200208のPHPに関する記事は13件です。

とりあえずLaradockで

対象者

とりあえずインフラとかDockerとか慣れてなくてよく分からないけど、手早くLaravelを動かせればいいやーって人向けです。

Laradockとは

公式サイトには「Laradockは、Dockerに基づく完全なPHP開発環境です。」とあります。

Laradock is a full PHP development environment based on Docker.

公式

https://laradock.io/

前提

  • パソコンがある
  • Wifiがある

※あとDockerのいんすとーるとかはやっといてくださーい、gitも要るよー。

手順

1. ローカルでディレクトリを作成

  • 任意のディレクトリ作成
$ mkdir laradock
$ cd laradock/

2. LaradockのリポジトリをClone

GithubからLaradockのリポジトリをクローン

$ git clone https://github.com/Laradock/laradock.git laradock-practice
$ cd laradock-practice/

laradock-practiceの部分は、好きに変えてください。
デフォルトでは「laradock」というディレクトリになりますが、引数に名前を渡すとオリジナルのものができあがります。名前はつけておいたほうがいいっすね。

3. 各種設定 (Laradock)

  • 設定ファイルのコピー作成
$ cp env-example .env

.env(設定ファイル)を開く

$ vi .env

以下の項目を探し、修正してください

修正前

APP_CODE_PATH_HOST=../

修正後

APP_CODE_PATH_HOST=../laradock-project

laradock-projectの部分はこれから作るLaravelプロジェクトの名前にしてください。
LaravelのWebサーバー上で同期するディレクトリを指定しています。
これをちゃんと指定してあげないとアクセス時404エラーになります。

※viコマンドはコマンドでファイルの編集ができます。編集したい箇所で「i」を入力するとインサートモードになり文字が打てるようになります。インサートモードを終了するには「esc」ボタンを入力します。その後、編集したファイルを保存し、終了するには「:」と「wq」を立て続けに入力してください。

修正前

MYSQL_VERSION=latest
MYSQL_DATABASE=default
MYSQL_USER=default
MYSQL_PASSWORD=secret
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=root

修正後

MYSQL_VERSION=5.7(別に5.7じゃなくても)
MYSQL_DATABASE=このへんは
MYSQL_USER=じゆうに
MYSQL_PASSWORD=きめちゃってください
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=root

※詳しく調べていませんが、mysqlのverをlatestで最新にするとセキュリティ上の問題でうまく接続できないらしいです。僕はちなみに、5.7にしているのにうまく動かない時があり、なぜだろうと思っていたら「5.7t」と記述しており、5.7トンという重さを指定してしまっていたことがありました。

  • laradock-practice/nginx/sites/default.confの変更

これはnginxに関する設定ファイルです。
nginx起動時に表示するファイルなどを指定できるのですが、パスの指定がうまくいっていない場合があるので、修正する必要があれば書き換えましょう。
着目してもらいたいのは一部分です。
以下のような修正前の状態になっていれば、修正してください。
laradock-projectの部分はそれぞれ作成されるLaravelプロジェクトの名前を指定してください。

修正前

root /var/www/public;

修正後

root /var/www/laradock-project/public;

4. コンテナ立ち上げ〜プロジェクトの作成

  • コンテナの立ち上げ
$ docker-compose up -d mysql nginx

docker-compose upコマンドはdocker-compose.ymlに書かれた情報をもとに処理を実行します(コンテナイメージの作成からコンテナの立ち上げなど。引数なしだと記述されている内容すべてが実行されるので、ひとまずDBサーバのmysqlとwebサーバのnginxを指定します。
※-dはデタッチモード(バックグラウンドで起動します)

  • コンテナの起動確認

以下のように立ち上がっていれば大丈夫です。

$ docker ps
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                                            NAMES
82e444c0ae67        laradock_nginx       "/bin/bash /opt/star…"   6 seconds ago       Up 4 seconds        0.0.0.0:80-81->80-81/tcp, 0.0.0.0:443->443/tcp   laradock_nginx_1
bd531621d6a3        laradock_php-fpm     "docker-php-entrypoi…"   7 seconds ago       Up 6 seconds        9000/tcp                                         laradock_php-fpm_1
1665d8a83f3b        laradock_workspace   "/sbin/my_init"          8 seconds ago       Up 7 seconds        0.0.0.0:2222->22/tcp                             laradock_workspace_1
d8b22e74c28f        docker:dind          "dockerd-entrypoint.…"   10 seconds ago      Up 8 seconds        2375-2376/tcp                                    laradock_docker-in-docker_1
7af2df7ebe17        laradock_mysql       "docker-entrypoint.s…"   10 seconds ago      Up 8 seconds        0.0.0.0:3306->3306/tcp, 33060/tcp                laradock_mysql_1
  • ワークスペースコンテナに入る

ワークスペースコンテナに入ります。exec、bashでそのコンテナに対してコマンドが叩けるようになります。

ワークスペースとはLaravelの開発を進めるにあたって必要なcomposerなどのツール類が用意された作業スペースみたいなところです。

デフォルトだとrootでワークスペースに入ることになるのですが、後ほどcomposerコマンドを実行した際に、怒られてしまうので、怒られるのが苦手な人は--user=laradockとかでlaradockユーザーとしてワークスペースに入ってください。

$ docker-compose exec --user=laradock workspace bash
.../var/www$
  • Laravelプロジェクトの作成

以下のコマンドで、Laravelのプロジェクトがlaradockディレクトリと同じ階層の中に作成されます。
この実行内容だと最新verのLaravelでプロジェクトが作られます。ver指定したい場合は調べてください。

.../var/www$ composer create-project laravel/laravel laradock-project
...以下略
Application key set successfully.
  • プロジェクト内へ移動

プロジェクト内に移動します。

.../var/www$ cd laradock-project/

5. 各種設定(Laravelプロジェクト)

  • 設定ファイルの修正
.../var/www$ vi .env

以下のように修正

修正前

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=

修正後

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=このへんはさっきつくった
DB_USERNAME=Laradockの.envの内容と
DB_PASSWORD=合わせてください

.envの内容は先ほど作ったLaradockの方の内容と整合性が取れている必要がありますので合わせておいてください。

7. MySQLの確認

MySQLの設定がうまくいっているかを確認します。

  • MySQLコンテナへ入る

Ctl + dでワークスペースコンテナを出て、MySQLコンテナに入ります。

$ docker-compose exec mysql bash
  • MySQLへ接続

MySQLへ、接続します。defaultの部分は先ほど.envファイルで設定したユーザーネームを指定し、その後パスワードを聞かれるので、同じように.envで設定したパスワードを入力してください。うまくログインできればsqlコマンドが打てる画面に移り変わります。

# mysql -u default -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.27 MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
  • データベースの確認

うまく設定できていれば、.envで設定したデータベースが作られているはずです

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| default            |
+--------------------+
2 rows in set (0.02 sec)
  • ユーザーの確認(rootで入った場合のみ行えます)

こちらも設定できていれば、.envで設定したユーザーが登録されていることが確認できますが、mysqlにroot権限で接続している必要があります。

mysql> select User from mysql.user;
+---------------+
| User          |
+---------------+
| default       |
| root          |
| mysql.session |
| mysql.sys     |
| root          |
+---------------+
5 rows in set (0.02 sec)
  • マイグレーションチェック

マイグレーションを実行し、データベースの接続が上手くいっているかを確認します。
Laravelにおけるマイグレーションとはデータベースのバージョン管理機能のことです。

MySQL確認の延長ですが、一旦MySQLコンテナから抜け、ワークスペースコンテナに入り、プロジェクト内に移動して以下のコマンドを実行します。

データベース接続がうまくいっていればマイグレーションが実行されます。

$ php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.07 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.06 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.03 seconds)

ここまでの流れで上手くいかない場合

  • Laradock、Laravelプロジェクトの各.envファイルの整合性が取れていない可能性

→.envファイルの設定がそれぞれ同じになっているかを確認し、合っていなければ合わせてください。

  • ストレージデータの影響

→laradockでDBを使用する際のストレージがデフォルトで、~/.laradock/dataに設定されています。~/.laradock/dataにmysqlというディレクトリが存在しているので一旦削除してやり直してみてください。

補足
デフォルトで~/.laradock/dataが設定されていると説明しましたが、これでは他にLaradockを使ってプロジェクトを作成した際に同じ場所を参照してしまうので変えた方がいいっぽいです。ここでは詳しく解説はしませんので詳細は調べてください。

  • .envの書き換え等が反映されていない可能性

コンテナを立ち上げたまま、.env等の設定を書き換えただけでは内容が反映されません。
一度、コンテナを起動させ直しましょう。

再起動

$ docker-compose restart

ダメなら停止と削除〜起動

$ docker-compose down
$ docker-compose up -d mysql nginx

8. プロジェクトの起動確認

  • localhostへアクセス

nginxのコンテナを立ち上がっている状態でlocalhostへアクセスします。うまくいっていれば、Laravelのトップページが表示されます。

スクリーンショット 2020-02-08 19.51.35.png

上手くいかない場合

  • Laradockの.envファイルのAPP_CODE_PATH_HOSTの設定が正しくできていない

→プロジェクトが存在するパスをちゃんと記述してあげてください。

  • nginxのdefault.confのパス指定が上手くできていない

 →上記に手順を記載していますので、やり直してください。

  • nginxコンテナが立ち上がっていない

 →docker psコマンドで確認し、立ち上がっていなければ、立ち上げてください。

ここまでくればとりあえずの環境構築は完了です!

あとは煮るなり焼くなり好きにしてください!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

とりあえずLaradock

対象者

とりあえずインフラとかDockerとか慣れてなくてよく分からないけど、手早くLaravelを動かせればいいやーって人向けです。

Laradockとは

公式サイトには「Laradockは、Dockerに基づく完全なPHP開発環境です。」とあります。

Laradock is a full PHP development environment based on Docker.

公式

https://laradock.io/

前提

  • パソコンがある
  • Wifiがある

※あとDockerのいんすとーるとかはやっといてくださーい、gitも要るよー。

手順

1. ローカルでディレクトリを作成

  • 任意のディレクトリ作成
$ mkdir laradock
$ cd laradock/

2. LaradockのリポジトリをClone

GithubからLaradockのリポジトリをクローン

$ git clone https://github.com/Laradock/laradock.git laradock-practice
$ cd laradock-practice/

laradock-practiceの部分は、好きに変えてください。
デフォルトでは「laradock」というディレクトリになりますが、引数に名前を渡すとオリジナルのものができあがります。名前はつけておいたほうがいいっすね。

3. 各種設定 (Laradock)

  • 設定ファイルのコピー作成
$ cp env-example .env

.env(設定ファイル)を開く

$ vi .env

以下の項目を探し、修正してください

修正前

APP_CODE_PATH_HOST=../

修正後

APP_CODE_PATH_HOST=../laradock-project

laradock-projectの部分はこれから作るLaravelプロジェクトの名前にしてください。
LaravelのWebサーバー上で同期するディレクトリを指定しています。
これをちゃんと指定してあげないとアクセス時404エラーになります。

※viコマンドはコマンドでファイルの編集ができます。編集したい箇所で「i」を入力するとインサートモードになり文字が打てるようになります。インサートモードを終了するには「esc」ボタンを入力します。その後、編集したファイルを保存し、終了するには「:」と「wq」を立て続けに入力してください。

修正前

MYSQL_VERSION=latest
MYSQL_DATABASE=default
MYSQL_USER=default
MYSQL_PASSWORD=secret
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=root

修正後

MYSQL_VERSION=5.7(別に5.7じゃなくても)
MYSQL_DATABASE=このへんは
MYSQL_USER=じゆうに
MYSQL_PASSWORD=きめちゃってください
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=root

※詳しく調べていませんが、mysqlのverをlatestで最新にするとセキュリティ上の問題でうまく接続できないらしいです。僕はちなみに、5.7にしているのにうまく動かない時があり、なぜだろうと思っていたら「5.7t」と記述しており、5.7トンという重さを指定してしまっていたことがありました。

  • laradock-practice/nginx/sites/default.confの変更

これはnginxに関する設定ファイルです。
nginx起動時に表示するファイルなどを指定できるのですが、パスの指定がうまくいっていない場合があるので、修正する必要があれば書き換えましょう。
着目してもらいたいのは一部分です。
以下のような修正前の状態になっていれば、修正してください。
laradock-projectの部分はそれぞれ作成されるLaravelプロジェクトの名前を指定してください。

修正前

root /var/www/public;

修正後

root /var/www/laradock-project/public;

4. コンテナ立ち上げ〜プロジェクトの作成

  • コンテナの立ち上げ
$ docker-compose up -d mysql nginx

docker-compose upコマンドはdocker-compose.ymlに書かれた情報をもとに処理を実行します(コンテナイメージの作成からコンテナの立ち上げなど。引数なしだと記述されている内容すべてが実行されるので、ひとまずDBサーバのmysqlとwebサーバのnginxを指定します。
※-dはデタッチモード(バックグラウンドで起動します)

  • コンテナの起動確認

以下のように立ち上がっていれば大丈夫です。

$ docker ps
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                                            NAMES
82e444c0ae67        laradock_nginx       "/bin/bash /opt/star…"   6 seconds ago       Up 4 seconds        0.0.0.0:80-81->80-81/tcp, 0.0.0.0:443->443/tcp   laradock_nginx_1
bd531621d6a3        laradock_php-fpm     "docker-php-entrypoi…"   7 seconds ago       Up 6 seconds        9000/tcp                                         laradock_php-fpm_1
1665d8a83f3b        laradock_workspace   "/sbin/my_init"          8 seconds ago       Up 7 seconds        0.0.0.0:2222->22/tcp                             laradock_workspace_1
d8b22e74c28f        docker:dind          "dockerd-entrypoint.…"   10 seconds ago      Up 8 seconds        2375-2376/tcp                                    laradock_docker-in-docker_1
7af2df7ebe17        laradock_mysql       "docker-entrypoint.s…"   10 seconds ago      Up 8 seconds        0.0.0.0:3306->3306/tcp, 33060/tcp                laradock_mysql_1
  • ワークスペースコンテナに入る

ワークスペースコンテナに入ります。exec、bashでそのコンテナに対してコマンドが叩けるようになります。

ワークスペースとはLaravelの開発を進めるにあたって必要なcomposerなどのツール類が用意された作業スペースみたいなところです。

デフォルトだとrootでワークスペースに入ることになるのですが、後ほどcomposerコマンドを実行した際に、怒られてしまうので、怒られるのが苦手な人は--user=laradockとかでlaradockユーザーとしてワークスペースに入ってください。

$ docker-compose exec --user=laradock workspace bash
.../var/www$
  • Laravelプロジェクトの作成

以下のコマンドで、Laravelのプロジェクトがlaradockディレクトリと同じ階層の中に作成されます。
この実行内容だと最新verのLaravelでプロジェクトが作られます。ver指定したい場合は調べてください。

.../var/www$ composer create-project laravel/laravel laradock-project
...以下略
Application key set successfully.
  • プロジェクト内へ移動

プロジェクト内に移動します。

.../var/www$ cd laradock-project/

5. 各種設定(Laravelプロジェクト)

  • 設定ファイルの修正 .../var/www$ vi .env

以下のように修正

修正前

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=

修正後

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=このへんはさっきつくった
DB_USERNAME=Laradockの.envの内容と
DB_PASSWORD=合わせてください

.envの内容は先ほど作ったLaradockの方の内容と整合性が取れている必要がありますので合わせておいてください。

7. MySQLの確認

MySQLの設定がうまくいっているかを確認します。

  • MySQLコンテナへ入る

Ctl + dでワークスペースコンテナを出て、MySQLコンテナに入ります。

$ docker-compose exec mysql bash
  • MySQLへ接続

MySQLへ、接続します。defaultの部分は先ほど.envファイルで設定したユーザーネームを指定し、その後パスワードを聞かれるので、同じように.envで設定したパスワードを入力してください。うまくログインできればsqlコマンドが打てる画面に移り変わります。

# mysql -u default -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.27 MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
  • データベースの確認

うまく設定できていれば、.envで設定したデータベースが作られているはずです

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| default            |
+--------------------+
2 rows in set (0.02 sec)
  • ユーザーの確認(rootで入った場合のみ行えます)

こちらも設定できていれば、.envで設定したユーザーが登録されていることが確認できますが、mysqlにroot権限で接続している必要があります。

mysql> select User from mysql.user;
+---------------+
| User          |
+---------------+
| default       |
| root          |
| mysql.session |
| mysql.sys     |
| root          |
+---------------+
5 rows in set (0.02 sec)
  • マイグレーションチェック

マイグレーションを実行し、データベースの接続が上手くいっているかを確認します。
Laravelにおけるマイグレーションとはデータベースのバージョン管理機能のことです。

MySQL確認の延長ですが、一旦MySQLコンテナから抜け、ワークスペースコンテナに入り、プロジェクト内に移動して以下のコマンドを実行します。

データベース接続がうまくいっていればマイグレーションが実行されます。

$ php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.07 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.06 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.03 seconds)

ここまでの流れで上手くいかない場合

  • Laradock、Laravelプロジェクトの各.envファイルの整合性が取れていない可能性

→.envファイルの設定がそれぞれ同じになっているかを確認し、合っていなければ合わせてください。

  • ストレージデータの影響

→laradockでDBを使用する際のストレージがデフォルトで、~/.laradock/dataに設定されています。~/.laradock/dataにmysqlというディレクトリが存在しているので一旦削除してやり直してみてください。

補足
デフォルトで~/.laradock/dataが設定されていると説明しましたが、これでは他にLaradockを使ってプロジェクトを作成した際に同じ場所を参照してしまうので変えた方がいいっぽいです。ここでは詳しく解説はしませんので詳細は調べてください。

  • .envの書き換え等が反映されていない可能性

コンテナを立ち上げたまま、.env等の設定を書き換えただけでは内容が反映されません。
一度、コンテナを起動させ直しましょう。

再起動

$ docker-compose restart

ダメなら停止と削除〜起動

$ docker-compose down
$ docker-compose up -d mysql nginx

8. プロジェクトの起動確認

  • localhostへアクセス

nginxのコンテナを立ち上がっている状態でlocalhostへアクセスします。うまくいっていれば、Laravelのトップページが表示されます。

スクリーンショット 2020-02-08 19.51.35.png

上手くいかない場合

  • Laradockの.envファイルのAPP_CODE_PATH_HOSTの設定が正しくできていない

→プロジェクトが存在するパスをちゃんと記述してあげてください。

  • nginxのdefault.confのパス指定が上手くできていない

 →上記に手順を記載していますので、やり直してください。

  • nginxコンテナが立ち上がっていない

 →docker psコマンドで確認し、立ち上がっていなければ、立ち上げてください。

ここまでくればとりあえずの環境構築は完了です!

あとは煮るなり焼くなり好きにしてください!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Moodle 3.8 マニュアル - 管理者の心得集

原文

管理者の心得集

新しいコースのためのインポートしたバックアップファイルのためには特別なコースを使用してください。

コースのアーカイブをリストアするためにメイン Moodle サイトコースでファイルの領域を使用しないでください。フロントページがとても簡単に壊れます。その目的のためには特別なコースを設定する事がよりよいです!

  • 偶然誤ったコースのアーカイブをあなたのメインのサイトコースにリストアした場合、全員のための全サイトを壊すでしょう。また、デフォルトでは、全てのユーザーがメインのサイトコースのファイルへアクセスできます。あなたのコースに条件的な情報が含まれていたら、全てのユーザーに公開されてしまう可能性があります。

  • コースアーカイブをリストアする場合は、必ず隠れたコースを作成してください。他のサイトからのあなたのバックアップを隠れたコースのファイルに置いてください。そしてそのバックアップからコースをリストアしてください。
    テストには必ず本番サイトでないサイトを使用してください。

おおくの人は localhost が美しいものであると考えています。あなたはそれを壊し本番サイトへの影響を心配することはありません。たとえば、プラグインが動くかどうか分からない時は?あなたの本番コードのファイルを localhost にダウンロードして、moodle の config.php ファイルを変更してやってみるとか。

関連項目

Administration FAQ(翻訳準備中)
もっと完全な管理者の心得集は、Beginning Administration FAQ(翻訳準備中)を考慮したいかもしれません。

カテゴリ:管理者
メインページ

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Moodle 3.8 マニュアル - 管理の基本

原文

コースを追加する

ユーザーを追加する

あなたのサイトをカスタマイズする

カテゴリ:管理者
メインページ

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

オブジェクト指向とクラス

今回はこれまでの学習の振り返りと定着も兼ねて、オブジェクト指向とクラスの概念について簡単ですがまとめてみました。
私も含め、オブジェクトは多くの初学者が挫折するポイントだと思うので、この記事が少しでも役に立てば幸いです。

オブジェクトとは

オブジェクトとは、処理や定義をまとめた塊の事です。
この時、オブジェクト内の変数をプロパティ、関数をメソッドと呼びます。
例えば、下記のようにする事で配列もオブジェクトにする事ができます。

<?php
$object = (object)[
       'a' => 100,
       'b' => 100,
       'c' => 100,
]

これは、配列をオブジェクト型でキャストする事で強制的にオブジェクトを作成しています。

オブジェクトの中を参照する

オブジェクトの中にあるメソッドやプロパティを利用する場合は、アロー演算子(->)と呼ばれる演算子を使います。
配列で作っていますが、キーの参照はできないので注意して下さい。

<?php
$object = (object)[
       'a' => 100,
       'b' => 200,
       'c' => 300,
];
echo $object->a;

クラスとは

クラスとはオブジェクトの設計図にあたります。
クラスを宣言することによって、その設計構造を持ったオブジェクトを作る事が可能となります。このオブジェクトの事をクラスオブジェクトといいます。

それでは、下記を参考にTestクラスを作成してみましょう。

test.php
<?php
class Test {
      private $old = 0;
      protected $name = '';
      public $force_name = '斎藤';

      public function hello($name, $old)
      {
            $this->name = $name;
            $msg = '私の名前は,' .$name . 'です。';

            if($old > 0) {
                 $msg = $old . '歳です。';
            }
            return $msg;
      }
}

このPHPを実行しても何も表示されません。
前述したように、クラスでは設計図を作成しただけの状態です。

クラスをインスタンス化する

クラスからオブジェクを新たに作成する事をインスタンス化と言い、インスタンス化されたものをインスタンスと呼びます。
Test.phpを作った同じフォルダに下記のファイルを作成してみましょう。

index.php
<?php
require_once('./Test.php');

$test = new Test();
$test->hello('太郎', 10);

index.phpの作成が完了したら、ブラウザからアクセスしてみましょう。
おそらく下記のような実行結果が得られると思います。

私の名前は太郎です。 10歳です。

このようにクラスをインスタンス化し、インスタンス化された変数を使って処理を行うのが一般的な使い方です。

また、クラスをインスタンス化する場合、そのクラスを宣言している処理が記述してある必要があります。上記の例では下記のようにしてTest.phpを読み込ませて処理済みのように見せかけています。

<?php
require_once('./Test.php');

クラスの継承

クラスには「継承」という概念が存在します。
継承を行ったクラスでは、継承元のクラスの機能をコンストラクタ以外の全て持つ事が出来るよになります。
それではTest.phpをBase.phpに変更し、Test.phpというファイルを作成してください。

test.php
<?php
require_once('./Base.php');

class Test exteds Base {
}
Base.php
<?php
class Base {
      private $old = 0;
      protected $name = '';
      public $force_name = '斎藤';

      public function hello($name, $old)
      {
             $this->name = $name;
             $msg = '私の名前は、' .$name . 'です。';

             if($old > 0) {
                  $msg = $old . '歳です';
             }
             return $msg;
      }
}

作成できたら、ブラウザからindex.phpにアクセスしてみましょう。
Test.phpにはhello関数がないにもかかわらず、先ほどと同じ表示になります。
これはつまり、TestクラスがBaseクラスの機能を継承したという事になります。

アクセス修飾子

継承の理解に併せて、アクセス修飾子も抑えておきましょう。
クラス内でプロパティやメソッドを宣言する時、public、private、protectedという宣言をする必要があります。

これは、変数や関数へのスコープの制限を行っています。

public・・・クラスでもインスタンスでも参照できる
private・・・自分のクラス内からしか参照できない
protected・・・継承元のクラスまでが参照できる

クラス内で定義したプロパティやメソッドをクラウ内で利用する場合、$this->を先頭に付ける必要があります。これは「自分自身のクラス内」という意味を持ちます。
こうする事で、自身のプロパティを書き換えたり、メソッドを参照する事ができる様になります。
これは継承元のプロパティやメソッドでも同様に呼び出しができます。

実際に動きを確認してみます。

Base.php
class Base {
      private $old = 10;
      protected = $name = '太郎';
      public $force_name = '山田';

      public function get_old() {
             return $this->old;
     }

     public function get_name() {
            return $this->name;
     }

     public function get_force_name() {
            return $this->force_name;
     }

Test.php
require_once('./Base.php');
class Test exteds Base {
      public function get_old() {
             return $this->old;
      }

      public function get_name() {
             return $this->name;
      }

      public function get_force_name() {
             return $this->force_name;
      }
}
index.php
require_once('./Test.php');
$test = new Test;

echo $test->get_old();
echo $test->get_name();
echo $test->get_force_name();

ここでは一例を書きましたが、プロパティだけではなくメソッドにも適用する事ができます。
プロパティやメソッドの制約を書き換えて動きを確認すると理解が一層深まると思います。

さいごに

いかがだったでしょうか。
簡単ですが、オブジェクトとクラスとアクセス修飾子についてでした。
オブジェクト指向はPHPだけでなく、あらゆる言語で用いられ避けては通れない概念ですので,
理解を深めたいものです。
冒頭でもお伝えしましたが、この記事を読んで少しでも理解のきっかけになれば幸いです。
今後も皆様の役に立つ情報を発信出来たらと思いますのでよろしくお願い致します。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHP 上級試験範囲 グラフィックスまとめ

HTMLページへの画像埋め込み

  • 画像が埋めこまれているHTMLページをwebブラウザに表示しようとすると、webブラウザからwebサーバへ、HTMLページそのものに対するリクエストと、画像に対するリクエストの両方が送信される。

  • webサーバからwebブラウザへ送信されるレスポンスは、レスポンスヘッダレスポンスボディの2つの部分で構成されている。
    レスポンスヘッダには「Content-Type」というヘッダが含まれている。
    webブラウザはこのヘッダにより、レスポンスボディに含まれるデータの種別を判別している。
    レスポンスボディ部分に含まれるデータは、HTMLファイルや画像ファイルそのものを指す。

  • HTMLページ内に<img src ="test.php" />のような記述をし、画像を生成するPHPスクリプトが実行できる。

test.php
header('Content-Type: image/jpg');
readfile('/tmp/test.jpg');
  • HTMLページ内に<img src ="test.php?text=OK" />のような記述をし、「OK」というテキストが描画された画像を生成するPHPスクリプトを実行することができる。

  • HTMLページ内に<img src ="buttons/ok.png" />のような記述をし、「OK.png」がwebサーバに存在しない場合のみ、その画像を生成するPHPスクリプトを実行することができる。

グラフィックスの基本概念

  • 画像内の色の情報は、パレットに記録されている。
    パレットとは画像内の色情報の配列で、RBG(赤、青、緑)をそれぞれ0(暗い)~255(明るい)の256段階で表したもの。

  • 画像はjpgpngなど、さまざまなファイルフォーマットで保存、送信することができる。
    なかには、gifのように1ファイルあたり最大256色までしか記録できないという制限があるものもある。

  • アンチエイリアスを有効にすると、ジャギーを目立たなくすることができる。

  • アルファチャネルとは、透明度を表す情報のことである。

GD拡張モジュール

GD拡張モジュールの確認とインストール

GDモジュールが使用できるかどうかは、phpのphpinfo()で確認することができる。

php
phpinfo();

gdと書いてある欄が表示されていてGD Supportenableになっていれば使用することができる。
ない場合はインストール。

■インストール

phpのバージョン確認

php -v

PHPのバージョンに合った、GDをインストール

yum list | grep gd
sudo yum install php72-php-gd.x86_64 --enablerepo=remi

インストール先が想定と違うので、インストール先のパスを確認し、シンボリックリンクを作成

rpm -ql php72-php-gd.x86_64
/opt/remi/php72/root/usr/lib64/php/modules/gd.so

ln -s /opt/remi/php54/root/usr/lib72/php/modules/gd.so /usr/lib64/php/modules/gd.so

php.iniのgdにextension=gd.so記述を追加し、apacheを再起動

sudo vi /etc/php.ini 

service httpd restart

インストール完了。

GD拡張モジュールについて

GDは、オープンソースの画像処理ライブラリ。
GDを使用すると、画像ファイルの読み書き、ボタンやグラフの描画、サムネイルの作成などの画像処理をプログラム上から行える。
GD拡張モジュールは、GDをPHPから扱えるようにする拡張モジュールである。

  • GDが作成する画像の種類には、パレット形式の画像フルカラー画像の2種類がある。
パレット形式の画像 フルカラー画像
各ピクセルはパレットの色番号を持つ(256色) 各ピクセルは赤・緑・青の情報を持つ。(色数無制限)
  • GDの図形描画関数は、画像の左上を(0, 0)とする座標を使用して、描画位置を指定する。

  • GDは、点、直線、短形、円、多角形などの図形を描画するための関数を提供している。
    これらの関数の第1引数に画像リソースを与えることで、その画像に図形の描画を行うことができる。
    画像リソースは、GD上で操作している画像を指し示すものであり、既存の画像ファイルを読み込んで作成するか、または画像ファイルを読み込まずメモリ上に新規に作成する。
    画像リソースはPHPのオブジェクトとは異なるものである。

  • 以下でGDの機能のサポート状況を調べることができる。

php
var_dump(gd_info());

// 結果
array(13) {
  ["GD Version"]=>
  string(5) "2.2.5"
  ["FreeType Support"]=>
  bool(true)
  ["FreeType Linkage"]=>
  string(13) "with freetype"
  ["GIF Read Support"]=>
  bool(true)
  ["GIF Create Support"]=>
  bool(true)
  ["JPEG Support"]=>
  bool(true)
  ["PNG Support"]=>
  bool(true)
  ["WBMP Support"]=>
  bool(true)
  ["XPM Support"]=>
  bool(true)
  ["XBM Support"]=>
  bool(true)
  ["WebP Support"]=>
  bool(true)
  ["BMP Support"]=>
  bool(true)
  ["JIS-mapped Japanese Font Support"]=>
  bool(false)
}
  • ImageTypes()を使用すると、現在の動作環境でサポートされるファイルフォーマットを調べることができる。 ImageTypesの返り値は、サポートされるファイルフォーマットに対応するビットフィールド(IMG_GIF、IMG_PNG、IMG_JPEGなどの論理和)。 サポートされるファイルフォーマットを調べる方法は以下。
php
if (ImageTypes() & IMG_GIF) {
    echo 'GIFがサポートされています。';
}

// 結果:GIFがサポートされています。
  • ImageCreateFromGIF()ImageCreateFromPNG()ImageCreateFromJPEG()は、それぞれ既存のフォーマットファイルから画像データを読み取ることで、画像リソースを作成し、その画像リソースを返す。
php
$file = 'img/test.jpg';
$res = ImageCreateFromJPEG($file);

var_dump($res);

// 結果:resource(185) of type (gd)

  • 画像リソースは、ImageCreate()ImageCreateTrueColor()で画像の幅・高さを指定して新規に作成することができる。 ImageCreate()は、パレット形式の画像を新規作成し、画像リソースを返す。 ImageCreateTrueColor()は、パレット形式の画像を新規作成し、画像リソースを返す。
php
$width = 300;
$height = 200;
$res = ImageCreate($width, $height);

var_dump($res);

// 結果:resource(184) of type (gd)
  • ImageCreate()を使用して作成したパレット形式の画像の場合、その画像リソースに対してImageColorAllocate()で最初に作成した色が、その画像の背景色となる。

■背景色の設定

php
$width = 300;
$height = 200;
$res = ImageCreate($width, $height);
$color = ImageColorAllocate($res, 255, 0, 0);
  • ImageGIF()ImagePNG()ImageJPEG()などの関数を使用した場合、対応するContent-Typeヘッダが自動的に出力されるわけではない。
    header()を使用して明示的に送信する必要がある。

  • スクリプト内で作成された画像リソースは、そのスクリプトの実行が終わると自動的に破棄される。

  • ImageSetPixel()は、点を描画する関数である。

  • ImageLine()は、直線を描画する関数である。
    ※曲線を描画する関数は存在しない。

  • ImageDashedLine()は、破線を描画する関数である。

  • ImageRectangle()は短形(四角形)を描画する関数である。

  • ImageFilledRectangle()は、内部を塗りつぶした短形(四角形)を描画する関数である。

  • GDには三角形を描画する関数はない。

  • ImagePolygon()は、多角形(ポリゴン)を描画する関数である。

  • ImageFilledPolygon()は、内部を塗りつぶした多角形(ポリゴン)を描画する関数である。

  • ImageEllipse()は、楕円を描画する関数である。

  • ImageFilledArc()は、内部が塗りつぶされた楕円を描画する関数である。

  • ImageFill()は、塗りつぶしを行う関数である。

  • ImageFillToBorder()は、特定の色で囲まれた部分の塗りつぶしを行う関数である。
    塗りつぶしのパターンを指定することはできないため、縞模様や網目模様に塗りつぶしを行うことはできない。

  • グラデーションがかかった画像をImageFill()で塗りつぶすと、塗りつぶし開始位置と同色の部分だけが塗りつぶされるので、グラデーション全体を塗りつぶすことはできない。

  • ImageRotaete()は画像の回転を行う関数である。
    第一引数の画像リソースは変更されず、回転を行った新しい画像リソースを返す。
    第二引数に正の値を指定すれば反時計回りに、負の値を指定すれば時計回りに回転させることができる。
    回転の中心座標を指定することはできない。回転の中心座標は、画像の中央となる。
    回転によって元画像の辺を超える場合は、回転先の画像を収めるのに必要なだけ幅・高さが拡大される。
    拡大によって生じた領域は第三引数に指定した色で塗りつぶされる。

  • ImageString()は組み込みのフォントを使用して文字列を描画する関数である。
    ImageString()は、日本語を含むマルチバイト文字には対応していない。
    そのため日本語を描画することができない。

  • ImageTTFText()は、TrueTypeフォントを使用して文字列を描画する関数である。
    デフォルトでは、ImageTTFText()はアンチエイリアスを使用して描画を行う。
    アンチエイリアスを無効にするには、第六引数の描画色に負数を指定する。

  • ImageTTFBBox()は、指定した文字列を描画する際に必要となる領域(バウンディングボックス)の頂点4点の座標配列で返す。文字列や四角形を描画する関数ではない。

  • ImageSx()は画像の幅、ImageSy()は画像の高さを求める関数である。

  • ImageCopyresized()ImageCopyResampled()は、画像のコピーと拡大・縮小を行う関数である。
    ImageCopyResampled()は、GDバージョン2.x以降で使用することができる。
    ImageCopyResized()よりも処理に時間がかかるが、リサンプリング(マージされるピクセルの色の平均を取る処理)を行うことで、品質の高い拡大・縮小を行うことができる。

  • ImageCreate()で作成したパレット形式の画像には、256色までしか使用できないという制限がある。
    リサンプリングの際にはより多くの色が必要になることがあるため、リサンプリングによって256色以上の色が
    必要になった場合は必要な色の割り当てができなくなる。したがって、リサンプリングをする際は、ImageCreateTrueColor()を使用してフルカラー画像のリソースを作成するようにする。

  • 画像リソースがパレット形式の画像化フルカラー画像化どうかを確認するには、ImagelsTrueColor()を使用する。フルカラーの場合は、trueを返す。

  • フルカラー画像におけるアルファチャネルのビット数は7ビットである。

  • ImageTrueColorToPalette()は、フルカラー画像をパレット形式の画像に変換する。

  • 画像内の位置を指定して、その位置の色を調べるには、ImageColorAt()を使用する。

  • ImageColorsForIndex()は、ImageColorAt()が返した値をRGB値およびアルファチャネル値を含む配列に変換する。

  • GDにおけるアルファチャネル値は、128段階の設定が可能。
    10進数では0~127の範囲となる、
    数字が大きいほど透明度が大きくなる。半透明の場合は、アルファチャネル値に127の約半分の63を指定する。

  • ImageColorResolveAlpha()は、アルファチャネル値(透明度)を含む色を作成する。

  • ImageAlphaBlending()は、イメージのブレンドモードを設定する。

  • フルカラー画像のデフォルトのブレンドモードはtrue(アルファブレンディングが有効)。

  • これは、色のアルファチャネルを反映した描画が行われる。ImageAlphaBlending()を使用することで、アルファブレンディングを一時的に無効にしたり、再び有効に戻したりすることができる。

参照

徹底攻略 PHP5 技術者認定 [上級] 試験問題集 [PJ0-200]対応

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHPのmethod_existsとis_callableの挙動

オブジェクト生成前

class TestClass
{
    public function publicMethod()
    {
        echo "public<br>\n";
    }
    protected function protectedMethod()
    {
        echo "protected<br>\n";
    }
    private function privateMethod()
    {
        echo "private<br>\n";
    }
    public static function publicStaticMethod()
    {
        echo "public static<br>\n";
    }
    protected static function protectedStaticMethod()
    {
        echo "protected static<br>\n";
    }
    private static function privateStaticMethod()
    {
        echo "private static<br>\n";
    }
}


var_dump( method_exists('TestClass', '__construct') );                  // false
var_dump( method_exists('TestClass', '__get') );                        // false
var_dump( method_exists('TestClass', 'publicMethod') );                 // true
var_dump( method_exists('TestClass', 'protectedMethod') );              // true
var_dump( method_exists('TestClass', 'privateMethod') );                // true
var_dump( method_exists('TestClass', 'publicStaticMethod') );           // true
var_dump( method_exists('TestClass', 'protectedStaticMethod') );        // true
var_dump( method_exists('TestClass', 'privateStaticMethod') );          // true

var_dump( is_callable(array('TestClass', '__construct')) );             // false
var_dump( is_callable(array('TestClass', '__get')) );                   // false
var_dump( is_callable(array('TestClass', 'publicMethod')) );            // true
var_dump( is_callable(array('TestClass', 'protectedMethod')) );         // false
var_dump( is_callable(array('TestClass', 'privateMethod')) );           // false
var_dump( is_callable(array('TestClass', 'publicStaticMethod')) );      // true
var_dump( is_callable(array('TestClass', 'protectedStaticMethod')) );   // false
var_dump( is_callable(array('TestClass', 'privateStaticMethod')) );     // false

オブジェクト生成後

$TestClass = new TestClass();

var_dump( method_exists($TestClass, '__construct') );                   // false
var_dump( method_exists($TestClass, '__get') );                         // false
var_dump( method_exists($TestClass, 'publicMethod') );                  // true
var_dump( method_exists($TestClass, 'protectedMethod') );               // true
var_dump( method_exists($TestClass, 'privateMethod') );                 // true
var_dump( method_exists($TestClass, 'publicStaticMethod') );            // true
var_dump( method_exists($TestClass, 'protectedStaticMethod') );         // true
var_dump( method_exists($TestClass, 'privateStaticMethod') );           // true

var_dump( is_callable(array($TestClass, '__construct')) );              // false
var_dump( is_callable(array($TestClass, '__get')) );                    // false
var_dump( is_callable(array($TestClass, 'publicMethod')) );             // true
var_dump( is_callable(array($TestClass, 'protectedMethod')) );          // false
var_dump( is_callable(array($TestClass, 'privateMethod')) );            // false
var_dump( is_callable(array($TestClass, 'publicStaticMethod')) );       // true
var_dump( is_callable(array($TestClass, 'protectedStaticMethod')) );    // false
var_dump( is_callable(array($TestClass, 'privateStaticMethod')) );      // false

クラスの継承

class TestChildClass extends TestClass
{
    public function __construct()
    {
        echo "__construct<br>\n";
    }
    public function __get($get)
    {
        echo "__get<br>\n";
    }
    public function check()
    {
        echo "</pre>\n<h2>子オブジェクト \$this</h2>\n<pre>";

        var_dump( method_exists($this, '__construct') );                    // true
        var_dump( method_exists($this, '__get') );                          // true
        var_dump( method_exists($this, 'publicMethod') );                   // true
        var_dump( method_exists($this, 'protectedMethod') );                // true
        var_dump( method_exists($this, 'privateMethod') );                  // true
        var_dump( method_exists($this, 'publicStaticMethod') );             // true
        var_dump( method_exists($this, 'protectedStaticMethod') );          // true
        var_dump( method_exists($this, 'privateStaticMethod') );            // true

        var_dump( is_callable(array($this, '__construct')) );               // true
        var_dump( is_callable(array($this, '__get')) );                     // true
        var_dump( is_callable(array($this, 'publicMethod')) );              // true
        var_dump( is_callable(array($this, 'protectedMethod')) );           // true
        var_dump( is_callable(array($this, 'privateMethod')) );             // false
        var_dump( is_callable(array($this, 'publicStaticMethod')) );        // true
        var_dump( is_callable(array($this, 'protectedStaticMethod')) );     // true
        var_dump( is_callable(array($this, 'privateStaticMethod')) );       // false

        echo "</pre>\n<h2>子オブジェクト self</h2>\n<pre>";

        var_dump( method_exists('self', '__construct') );                   // false
        var_dump( method_exists('self', '__get') );                         // false
        var_dump( method_exists('self', 'publicMethod') );                  // false
        var_dump( method_exists('self', 'protectedMethod') );               // false
        var_dump( method_exists('self', 'privateMethod') );                 // false
        var_dump( method_exists('self', 'publicStaticMethod') );            // false
        var_dump( method_exists('self', 'protectedStaticMethod') );         // false
        var_dump( method_exists('self', 'privateStaticMethod') );           // false

        var_dump( is_callable(array('self', '__construct')) );              // true
        var_dump( is_callable(array('self', '__get')) );                    // true
        var_dump( is_callable(array('self', 'publicMethod')) );             // true
        var_dump( is_callable(array('self', 'protectedMethod')) );          // true
        var_dump( is_callable(array('self', 'privateMethod')) );            // false
        var_dump( is_callable(array('self', 'publicStaticMethod')) );       // true
        var_dump( is_callable(array('self', 'protectedStaticMethod')) );    // true
        var_dump( is_callable(array('self', 'privateStaticMethod')) );      // false

        echo "</pre>\n<h2>子オブジェクト parent</h2>\n<pre>";

        var_dump( method_exists('parent', '__construct') );                 // false
        var_dump( method_exists('parent', '__get') );                       // false
        var_dump( method_exists('parent', 'publicMethod') );                // false
        var_dump( method_exists('parent', 'protectedMethod') );             // false
        var_dump( method_exists('parent', 'privateMethod') );               // false
        var_dump( method_exists('parent', 'publicStaticMethod') );          // false
        var_dump( method_exists('parent', 'protectedStaticMethod') );       // false
        var_dump( method_exists('parent', 'privateStaticMethod') );         // false

        var_dump( is_callable(array('parent', '__construct')) );            // false
        var_dump( is_callable(array('parent', '__get')) );                  // false
        var_dump( is_callable(array('parent', 'publicMethod')) );           // true
        var_dump( is_callable(array('parent', 'protectedMethod')) );        // true
        var_dump( is_callable(array('parent', 'privateMethod')) );          // false
        var_dump( is_callable(array('parent', 'publicStaticMethod')) );     // true
        var_dump( is_callable(array('parent', 'protectedStaticMethod')) );  // true
        var_dump( is_callable(array('parent', 'privateStaticMethod')) );    // false

        echo "</pre>\n<h2>子オブジェクト static</h2>\n<pre>";

        var_dump( method_exists('static', '__construct') );                 // false
        var_dump( method_exists('static', '__get') );                       // false
        var_dump( method_exists('static', 'publicMethod') );                // false
        var_dump( method_exists('static', 'protectedMethod') );             // false
        var_dump( method_exists('static', 'privateMethod') );               // false
        var_dump( method_exists('static', 'publicStaticMethod') );          // false
        var_dump( method_exists('static', 'protectedStaticMethod') );       // false
        var_dump( method_exists('static', 'privateStaticMethod') );         // false

        var_dump( is_callable(array('static', '__construct')) );            // true
        var_dump( is_callable(array('static', '__get')) );                  // true
        var_dump( is_callable(array('static', 'publicMethod')) );           // true
        var_dump( is_callable(array('static', 'protectedMethod')) );        // true
        var_dump( is_callable(array('static', 'privateMethod')) );          // false
        var_dump( is_callable(array('static', 'publicStaticMethod')) );     // true
        var_dump( is_callable(array('static', 'protectedStaticMethod')) );  // true
        var_dump( is_callable(array('static', 'privateStaticMethod')) );    // false
    }
}

echo "</pre>\n<h2>子オブジェクト生成前</h2>\n<pre>";

var_dump( method_exists('TestChildClass', '__construct') );                 // true
var_dump( method_exists('TestChildClass', '__get') );                       // true
var_dump( method_exists('TestChildClass', 'publicMethod') );                // true
var_dump( method_exists('TestChildClass', 'protectedMethod') );             // true
var_dump( method_exists('TestChildClass', 'privateMethod') );               // true
var_dump( method_exists('TestChildClass', 'publicStaticMethod') );          // true
var_dump( method_exists('TestChildClass', 'protectedStaticMethod') );       // true
var_dump( method_exists('TestChildClass', 'privateStaticMethod') );         // true

var_dump( is_callable(array('TestChildClass', '__construct')) );            // false
var_dump( is_callable(array('TestChildClass', '__get')) );                  // false
var_dump( is_callable(array('TestChildClass', 'publicMethod')) );           // true
var_dump( is_callable(array('TestChildClass', 'protectedMethod')) );        // false
var_dump( is_callable(array('TestChildClass', 'privateMethod')) );          // false
var_dump( is_callable(array('TestChildClass', 'publicStaticMethod')) );     // true
var_dump( is_callable(array('TestChildClass', 'protectedStaticMethod')) );  // false
var_dump( is_callable(array('TestChildClass', 'privateStaticMethod')) );    // false

echo "</pre>\n<h2>子オブジェクト生成後</h2>\n<pre>";

$TestChildClass = new TestChildClass();

var_dump( method_exists($TestChildClass, '__construct') );                  // true
var_dump( method_exists($TestChildClass, '__get') );                        // true
var_dump( method_exists($TestChildClass, 'publicMethod') );                 // true
var_dump( method_exists($TestChildClass, 'protectedMethod') );              // true
var_dump( method_exists($TestChildClass, 'privateMethod') );                // true
var_dump( method_exists($TestChildClass, 'publicStaticMethod') );           // true
var_dump( method_exists($TestChildClass, 'protectedStaticMethod') );        // true
var_dump( method_exists($TestChildClass, 'privateStaticMethod') );          // true

var_dump( is_callable(array($TestChildClass, '__construct')) );             // true
var_dump( is_callable(array($TestChildClass, '__get')) );                   // true
var_dump( is_callable(array($TestChildClass, 'publicMethod')) );            // true
var_dump( is_callable(array($TestChildClass, 'protectedMethod')) );         // false
var_dump( is_callable(array($TestChildClass, 'privateMethod')) );           // false
var_dump( is_callable(array($TestChildClass, 'publicStaticMethod')) );      // true
var_dump( is_callable(array($TestChildClass, 'protectedStaticMethod')) );   // false
var_dump( is_callable(array($TestChildClass, 'privateStaticMethod')) );     // false

$TestChildClass->check();

トレイトを使用した場合

trait FunctionTrait
{
    public function __construct()
    {
        echo "trait __construct<br>\n";
    }
    public function __get($get)
    {
        echo "trait __get<br>\n";
    }
    public function traitPublicMethod()
    {
        echo "trait public<br>\n";
    }
    protected function traitProtectedMethod()
    {
        echo "trait protected<br>\n";
    }
    private function traitPrivateMethod()
    {
        echo "trait private<br>\n";
    }
    public static function traitPublicStaticMethod()
    {
        echo "trait public static<br>\n";
    }
    protected static function traitProtectedStaticMethod()
    {
        echo "trait protected static<br>\n";
    }
    private static function traitPrivateStaticMethod()
    {
        echo "trait private static<br>\n";
    }

}

trait CheckTrait
{
    public function check()
    {
        echo "</pre>\n<h2>トレイト \$this</h2>\n<pre>";

        var_dump( method_exists($this, '__construct') );                    // true
        var_dump( method_exists($this, '__get') );                          // true
        var_dump( method_exists($this, 'publicMethod') );                   // true
        var_dump( method_exists($this, 'protectedMethod') );                // true
        var_dump( method_exists($this, 'privateMethod') );                  // true
        var_dump( method_exists($this, 'publicStaticMethod') );             // true
        var_dump( method_exists($this, 'protectedStaticMethod') );          // true
        var_dump( method_exists($this, 'privateStaticMethod') );            // true
        var_dump( method_exists($this, 'traitPublicMethod') );              // true
        var_dump( method_exists($this, 'traitProtectedMethod') );           // true
        var_dump( method_exists($this, 'traitPrivateMethod') );             // true
        var_dump( method_exists($this, 'traitPublicStaticMethod') );        // true
        var_dump( method_exists($this, 'traitProtectedStaticMethod') );     // true
        var_dump( method_exists($this, 'traitPrivateStaticMethod') );       // true

        var_dump( is_callable(array($this, '__construct')) );               // true
        var_dump( is_callable(array($this, '__get')) );                     // true
        var_dump( is_callable(array($this, 'publicMethod')) );              // true
        var_dump( is_callable(array($this, 'protectedMethod')) );           // true
        var_dump( is_callable(array($this, 'privateMethod')) );             // false
        var_dump( is_callable(array($this, 'publicStaticMethod')) );        // true
        var_dump( is_callable(array($this, 'protectedStaticMethod')) );     // true
        var_dump( is_callable(array($this, 'privateStaticMethod')) );       // false
        var_dump( is_callable(array($this, 'traitPublicMethod')) );         // true
        var_dump( is_callable(array($this, 'traitProtectedMethod')) );      // true
        var_dump( is_callable(array($this, 'traitPrivateMethod')) );        // true
        var_dump( is_callable(array($this, 'traitPublicStaticMethod')) );   // true
        var_dump( is_callable(array($this, 'traitProtectedStaticMethod')) );// true
        var_dump( is_callable(array($this, 'traitPrivateStaticMethod')) );  // true

        echo "</pre>\n<h2>トレイト self</h2>\n<pre>";

        var_dump( method_exists('self', '__construct') );                   // false
        var_dump( method_exists('self', '__get') );                         // false
        var_dump( method_exists('self', 'publicMethod') );                  // false
        var_dump( method_exists('self', 'protectedMethod') );               // false
        var_dump( method_exists('self', 'privateMethod') );                 // false
        var_dump( method_exists('self', 'publicStaticMethod') );            // false
        var_dump( method_exists('self', 'protectedStaticMethod') );         // false
        var_dump( method_exists('self', 'privateStaticMethod') );           // false
        var_dump( method_exists('self', 'traitPublicMethod') );             // false
        var_dump( method_exists('self', 'traitProtectedMethod') );          // false
        var_dump( method_exists('self', 'traitPrivateMethod') );            // false
        var_dump( method_exists('self', 'traitPublicStaticMethod') );       // false
        var_dump( method_exists('self', 'traitProtectedStaticMethod') );    // false
        var_dump( method_exists('self', 'traitPrivateStaticMethod') );      // false

        var_dump( is_callable(array('self', '__construct')) );                  // true
        var_dump( is_callable(array('self', '__get')) );                        // true
        var_dump( is_callable(array('self', 'publicMethod')) );                 // true
        var_dump( is_callable(array('self', 'protectedMethod')) );              // true
        var_dump( is_callable(array('self', 'privateMethod')) );                // false
        var_dump( is_callable(array('self', 'publicStaticMethod')) );           // true
        var_dump( is_callable(array('self', 'protectedStaticMethod')) );        // true
        var_dump( is_callable(array('self', 'privateStaticMethod')) );          // false
        var_dump( is_callable(array('self', 'traitPublicMethod')) );            // true
        var_dump( is_callable(array('self', 'traitProtectedMethod')) );         // true
        var_dump( is_callable(array('self', 'traitPrivateMethod')) );           // true
        var_dump( is_callable(array('self', 'traitPublicStaticMethod')) );      // true
        var_dump( is_callable(array('self', 'traitProtectedStaticMethod')) );   // true
        var_dump( is_callable(array('self', 'traitPrivateStaticMethod')) );     // true

        echo "</pre>\n<h2>トレイト parent</h2>\n<pre>";

        var_dump( method_exists('parent', '__construct') );                     // false
        var_dump( method_exists('parent', '__get') );                           // false
        var_dump( method_exists('parent', 'publicMethod') );                    // false
        var_dump( method_exists('parent', 'protectedMethod') );                 // false
        var_dump( method_exists('parent', 'privateMethod') );                   // false
        var_dump( method_exists('parent', 'publicStaticMethod') );              // false
        var_dump( method_exists('parent', 'protectedStaticMethod') );           // false
        var_dump( method_exists('parent', 'privateStaticMethod') );             // false
        var_dump( method_exists('parent', 'traitPublicMethod') );               // false
        var_dump( method_exists('parent', 'traitProtectedMethod') );            // false
        var_dump( method_exists('parent', 'traitPrivateMethod') );              // false
        var_dump( method_exists('parent', 'traitPublicStaticMethod') );         // false
        var_dump( method_exists('parent', 'traitProtectedStaticMethod') );      // false
        var_dump( method_exists('parent', 'traitPrivateStaticMethod') );        // false

        var_dump( is_callable(array('parent', '__construct')) );                // false
        var_dump( is_callable(array('parent', '__get')) );                      // false
        var_dump( is_callable(array('parent', 'publicMethod')) );               // true
        var_dump( is_callable(array('parent', 'protectedMethod')) );            // true
        var_dump( is_callable(array('parent', 'privateMethod')) );              // false
        var_dump( is_callable(array('parent', 'publicStaticMethod')) );         // true
        var_dump( is_callable(array('parent', 'protectedStaticMethod')) );      // true
        var_dump( is_callable(array('parent', 'privateStaticMethod')) );        // false
        var_dump( is_callable(array('parent', 'traitPublicMethod')) );          // false
        var_dump( is_callable(array('parent', 'traitProtectedMethod')) );       // false
        var_dump( is_callable(array('parent', 'traitPrivateMethod')) );         // false
        var_dump( is_callable(array('parent', 'traitPublicStaticMethod')) );    // false
        var_dump( is_callable(array('parent', 'traitProtectedStaticMethod')) ); // false
        var_dump( is_callable(array('parent', 'traitPrivateStaticMethod')) );   // false

        echo "</pre>\n<h2>トレイト static</h2>\n<pre>";

        var_dump( method_exists('static', '__construct') );                     // false
        var_dump( method_exists('static', '__get') );                           // false
        var_dump( method_exists('static', 'publicMethod') );                    // false
        var_dump( method_exists('static', 'protectedMethod') );                 // false
        var_dump( method_exists('static', 'privateMethod') );                   // false
        var_dump( method_exists('static', 'publicStaticMethod') );              // false
        var_dump( method_exists('static', 'protectedStaticMethod') );           // false
        var_dump( method_exists('static', 'privateStaticMethod') );             // false
        var_dump( method_exists('static', 'traitPublicMethod') );               // false
        var_dump( method_exists('static', 'traitProtectedMethod') );            // false
        var_dump( method_exists('static', 'traitPrivateMethod') );              // false
        var_dump( method_exists('static', 'traitPublicStaticMethod') );         // false
        var_dump( method_exists('static', 'traitProtectedStaticMethod') );      // false
        var_dump( method_exists('static', 'traitPrivateStaticMethod') );        // false

        var_dump( is_callable(array('static', '__construct')) );                // true
        var_dump( is_callable(array('static', '__get')) );                      // true
        var_dump( is_callable(array('static', 'publicMethod')) );               // true
        var_dump( is_callable(array('static', 'protectedMethod')) );            // true
        var_dump( is_callable(array('static', 'privateMethod')) );              // false
        var_dump( is_callable(array('static', 'publicStaticMethod')) );         // true
        var_dump( is_callable(array('static', 'protectedStaticMethod')) );      // true
        var_dump( is_callable(array('static', 'privateStaticMethod')) );        // false
        var_dump( is_callable(array('static', 'traitPublicMethod')) );          // true
        var_dump( is_callable(array('static', 'traitProtectedMethod')) );       // true
        var_dump( is_callable(array('static', 'traitPrivateMethod')) );         // true
        var_dump( is_callable(array('static', 'traitPublicStaticMethod')) );    // true
        var_dump( is_callable(array('static', 'traitProtectedStaticMethod')) ); // true
        var_dump( is_callable(array('static', 'traitPrivateStaticMethod')) );   // true
    }
}

class TestChildWithTraitClass extends TestClass
{
    use FunctionTrait;
    use CheckTrait;
}

echo "</pre>\n<h2>トレイト付き子オブジェクト生成前</h2>\n<pre>";

var_dump( method_exists('TestChildWithTraitClass', '__construct') );                    // true
var_dump( method_exists('TestChildWithTraitClass', '__get') );                          // true
var_dump( method_exists('TestChildWithTraitClass', 'publicMethod') );                   // true
var_dump( method_exists('TestChildWithTraitClass', 'protectedMethod') );                // true
var_dump( method_exists('TestChildWithTraitClass', 'privateMethod') );                  // true
var_dump( method_exists('TestChildWithTraitClass', 'publicStaticMethod') );             // true
var_dump( method_exists('TestChildWithTraitClass', 'protectedStaticMethod') );          // true
var_dump( method_exists('TestChildWithTraitClass', 'privateStaticMethod') );            // true
var_dump( method_exists('TestChildWithTraitClass', 'traitPublicMethod') );              // true
var_dump( method_exists('TestChildWithTraitClass', 'traitProtectedMethod') );           // true
var_dump( method_exists('TestChildWithTraitClass', 'traitPrivateMethod') );             // true
var_dump( method_exists('TestChildWithTraitClass', 'traitPublicStaticMethod') );        // true
var_dump( method_exists('TestChildWithTraitClass', 'traitProtectedStaticMethod') );     // true
var_dump( method_exists('TestChildWithTraitClass', 'traitPrivateStaticMethod') );       // true

var_dump( is_callable(array('TestChildWithTraitClass', '__construct')) );               // false
var_dump( is_callable(array('TestChildWithTraitClass', '__get')) );                     // false
var_dump( is_callable(array('TestChildWithTraitClass', 'publicMethod')) );              // true
var_dump( is_callable(array('TestChildWithTraitClass', 'protectedMethod')) );           // false
var_dump( is_callable(array('TestChildWithTraitClass', 'privateMethod')) );             // false
var_dump( is_callable(array('TestChildWithTraitClass', 'publicStaticMethod')) );        // true
var_dump( is_callable(array('TestChildWithTraitClass', 'protectedStaticMethod')) );     // false
var_dump( is_callable(array('TestChildWithTraitClass', 'privateStaticMethod')) );       // false
var_dump( is_callable(array('TestChildWithTraitClass', 'traitPublicMethod')) );         // true
var_dump( is_callable(array('TestChildWithTraitClass', 'traitProtectedMethod')) );      // false
var_dump( is_callable(array('TestChildWithTraitClass', 'traitPrivateMethod')) );        // false
var_dump( is_callable(array('TestChildWithTraitClass', 'traitPublicStaticMethod')) );   // true
var_dump( is_callable(array('TestChildWithTraitClass', 'traitProtectedStaticMethod')) );// false
var_dump( is_callable(array('TestChildWithTraitClass', 'traitPrivateStaticMethod')) );  // false

echo "</pre>\n<h2>トレイト付き子オブジェクト生成後</h2>\n<pre>";

$TestChildWithTraitClass = new TestChildWithTraitClass();

var_dump( method_exists($TestChildWithTraitClass, '__construct') );                     // true
var_dump( method_exists($TestChildWithTraitClass, '__get') );                           // true
var_dump( method_exists($TestChildWithTraitClass, 'publicMethod') );                    // true
var_dump( method_exists($TestChildWithTraitClass, 'protectedMethod') );                 // true
var_dump( method_exists($TestChildWithTraitClass, 'privateMethod') );                   // true
var_dump( method_exists($TestChildWithTraitClass, 'publicStaticMethod') );              // true
var_dump( method_exists($TestChildWithTraitClass, 'protectedStaticMethod') );           // true
var_dump( method_exists($TestChildWithTraitClass, 'privateStaticMethod') );             // true
var_dump( method_exists($TestChildWithTraitClass, 'traitPublicMethod') );               // true
var_dump( method_exists($TestChildWithTraitClass, 'traitProtectedMethod') );            // true
var_dump( method_exists($TestChildWithTraitClass, 'traitPrivateMethod') );              // true
var_dump( method_exists($TestChildWithTraitClass, 'traitPublicStaticMethod') );         // true
var_dump( method_exists($TestChildWithTraitClass, 'traitProtectedStaticMethod') );      // true
var_dump( method_exists($TestChildWithTraitClass, 'traitPrivateStaticMethod') );        // true

var_dump( is_callable(array($TestChildWithTraitClass, '__construct')) );                // true
var_dump( is_callable(array($TestChildWithTraitClass, '__get')) );                      // true
var_dump( is_callable(array($TestChildWithTraitClass, 'publicMethod')) );               // true
var_dump( is_callable(array($TestChildWithTraitClass, 'protectedMethod')) );            // false
var_dump( is_callable(array($TestChildWithTraitClass, 'privateMethod')) );              // false
var_dump( is_callable(array($TestChildWithTraitClass, 'publicStaticMethod')) );         // true
var_dump( is_callable(array($TestChildWithTraitClass, 'protectedStaticMethod')) );      // false
var_dump( is_callable(array($TestChildWithTraitClass, 'privateStaticMethod')) );        // false
var_dump( is_callable(array($TestChildWithTraitClass, 'traitPublicMethod')) );          // true
var_dump( is_callable(array($TestChildWithTraitClass, 'traitProtectedMethod')) );       // false
var_dump( is_callable(array($TestChildWithTraitClass, 'traitPrivateMethod')) );         // false
var_dump( is_callable(array($TestChildWithTraitClass, 'traitPublicStaticMethod')) );    // true
var_dump( is_callable(array($TestChildWithTraitClass, 'traitProtectedStaticMethod')) ); // false
var_dump( is_callable(array($TestChildWithTraitClass, 'traitPrivateStaticMethod')) );   // false

$TestChildWithTraitClass->check();
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【LaravelDB.com】新機能 ”テーブル定義をパッと見で理解する!” 「Newテーブル一覧表示機能」

New!2月8日 [Newテーブル一覧表示機能] について解説

DEMO動画(初めての人はこちらから)

【 YouTubeリンク>> LaravelDB.com の操作方法 】

LaravelDB.comについて詳しく知りたい人はこちらもどうぞ!!
https://qiita.com/daisu_yamazaki/items/068595670bdc2b6fe3fc
en.jpg

1. ER図画面から 「 ER図のLoad/Save 」ボタンをクリック

https://laraveldb.com
注意)テーブル定義(データ)が表示されてることを確認してください。

2. 「 MIGRATION/TABLE 」ボタンをクリック

3.ダウンロードしてフォルダを開く

ZIP圧縮ファイルをダウンロードします。
フォルダ内の「 table_design.html 」HTMLファイルをダブルクリックで開きます。

4.「テーブル一覧」を解りやすく表示


更に詳しく ↓↓↓↓↓↓

5.外部キー制約がある場合は以下のように表示されます。


これまた、わかりやすいですね。
カラム名・型・コメント、外部キーまで一覧で見れます!!

これでTeamメンバーやお客さま、他の人にもテーブル情報を共有可能ですね!!

以上

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【LaravelDB.com】〜機能解説〜 テーブル定義をHTML で”見やすく!”表示(機能アップデート)

LaravelDB.comの新機能[テーブル定義一覧(HTML)]について解説

en.jpg

DEMO動画(初めての人はこちらから)

【 YouTubeリンク>> LaravelDB.com の操作方法 】

LaravelDB.comについて詳しく知りたい人はこちらもどうぞ!!
https://qiita.com/daisu_yamazaki/items/068595670bdc2b6fe3fc

1. ER図画面から 「 ER図のLoad/Save 」ボタンをクリック

https://laraveldb.com
注意)テーブル定義(データ)が表示されてることを確認してください。

2. 「 MIGRATION/TABLE 」ボタンをクリック

3.ダウンロードしてフォルダを開く

ZIP圧縮ファイルをダウンロードします。
フォルダ内の「 table_design.html 」HTMLファイルをダブルクリックで開きます。

4.「テーブル一覧」を解りやすく表示


更に詳しく ↓↓↓↓↓↓

5.外部キー制約がある場合は以下のように表示されます。


これまた、わかりやすいですね。
カラム名・型・コメント、外部キーまで一覧で見れます!!

これでTeamメンバーやお客さま、他の人にもテーブル情報を共有可能ですね!!

以上

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Moodle 3.8 マニュアル - データベースのスキーマを確認する

原文

データベースのスキーマを確認する

もしあなたが Moodle をいくつかのバージョンに渡ってアップグレードしたのなら、ある変更があなたのデータベースとあなたが作成するあたらしい空のサイトで得るであろうバージョンの間のデータベースのテーブル定義("スキーマ")に忍び寄っている可能性(たぶん)があります。これはアップグレードスクリプトにおける小さなエラーあるいは見落としにより生じます。これらのほとんどの変更は害がないですが、いくつかは不思議な予期しない問題を引き起こすかもしれません。たとえば、デフォルトの値がフィールドに追加され、これがアップグレードスクリプトのコードに反映されなかった場合デフォルトを想定しているコードは期待通りには動作しないでしょう。

アップグレードをおこなった後(あるいは、もしあなたの問題がアップグレードが失敗するならば、前)に"本番"サイトと新しく作成したサイトのデータベースのスキーマを、全く同じコードのベースで比較することです。いくつかの方法がありますが、この記事は Unix コマンドラインを使用した簡単な方法で明らかにします。

  • アップグレードを完了する
  • 次のコマンドによりあなたの最近アップグレードしたサイトのデータベースのスキーマを生成する:
# MySQL
mysqldump --no-data -u root -p myproductiondb >production.schema
# PostgreSQL
pg_dump --schema-only -U postgres myproductiondb > production.schema
  • あなたの本番データベースのコードを新しい(ウェブでアクセス可能な)場所(これは重要です、そして同じバージョンでなければなりません)にコピーしてください。
  • インストールの指示により新しい、空のデータベースと moodledata の領域を新しいサイトに作成してください。
  • config.php ファイルを新しいデータベースとその場所に編集するかファイルを削除してインストールスクリプトを使用してください。
  • インストールスクリプトを走らせて config.php (もし該当するなら)とデータベース(admin とサイトの値は重要ではありません)を生成してください。
  • 次のコマンドによりあなたの新しいサイトのデータベースのスキーマを生成してください:
# MySQL
mysqldump --no-data -u root -p mycleandb >clean.schema
# PostgreSQL
pg_dump --schema-only -U postgres mycleandb > clean.schema
  • 変更を発見するために以下のコマンドを実行してください。
diff -u production.schema clean.schema >db.diff

今やあなたは差を確認するために db.diff ファイルをお気に入りのエディタで見ることができます。

注:上記は明らかに MySQL に当てはまります。その他のデータベースはスキーマだけをダンプする同様の機能を持っているようです。例えば PostgreSQL には pg_dump コマンドがあります。残りの議論はまだ当てはまります。

内容

1 diff ファイルを解釈する
1.1 手動で追いかけるには変更が多すぎますか?
2 心配すべきですか?
3 関連項目

1 diff ファイルを解釈する

まず、これが(実際の)一例です:

    --
    -- Table structure for table `mdl_backup_config`
       @@ -129,11 +93,11 @@
        DROP TABLE IF EXISTS `mdl_backup_config`;
        CREATE TABLE `mdl_backup_config` (
   -  `id` int(10) unsigned NOT NULL auto_increment,
   +  `id` bigint(10) unsigned NOT NULL auto_increment,
      `name` varchar(255) NOT NULL default ,
      `value` varchar(255) NOT NULL default ,
       PRIMARY KEY  (`id`),
   -  UNIQUE KEY `name` (`name`)
   +  UNIQUE KEY `mdl_backconf_nam_uix` (`name`)
        ) ENGINE=MyISAM AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 COMMENT='To store backup configuration variables';

ファイルは多くの変更ブロックを持っているでしょう。- 行は削除された行を示し + の行は置き換えられた行(本番から新しいもの)を示しています。したがってここでは int が bigint に置き換えられ key name が変更されています。両者は、技術的にある点までアップグレードスクリプトにより変更されたはずですが、欠けているでしょう。このケースでは Moodle の動作には影響を及ぼすとは考えられません。

1.1 手動で追いかけるには変更が多すぎますか?

新旧の Moodle データベースを同期するために、あなたはデータベース管理プログラムを使用できます。
たとえば、MySQL データベースのための MySQL Workbench のように。

これはもし多くの変更がある場合には大変便利です。

Unix/Linux のコマンドラインを実行できるのなら Python script Schema Sync はあなたのデータベースをアップデートするための全てのコマンドを生成する素早く簡単な方法を提供します。

2 心配すべきですか?

フィールドのタイプ(それらが互換性がある限りにおいて)とキーネームの変更がよくあるの問題でしょうが問題を引き起こすものではないでしょう。見るべきものは欠けたフィールドとデフォルト値への変更についての行でしょう。

もしあなたが Moodle 2.0 にアップグレードしようとしているのならもっと心配する必要があります。アップグレードをスムーズにすすめるためにはこれらの問題を修正することはいい考えです。

3 関連項目

  • サイト管理->開発->XMLDBエディタ->インデックスをチェックする で欠けているインデックスリポート

カテゴリ:インストール

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Moodle 3.8 マニュアル - XAMPP のアップグレード

原文

XAMPP のアップグレード

注意:これは進行中の作業です。完全ではなく性格でもないかもしれませんが完全にテストされています。
(訳者注: Windows という OS サーバのお話となり参考にはなりませんので項目のみを参考にしてください。)

このページはあなたが以下のことにあてはまる場合にあなたを助けることを意図しています。

  • Moodle ダウンロードのページからダウンロードした XAMPP あるいは XAMPP ベースのパッケージを入れた Windows サーバー
  • しばらく起動している Moodle がインストールされているものでありデータとユーザーを入れ込んだもの
  • ウェブサーバー(Apache, PHP, MySQL)の全てあるいは一部に新しいバージョンへのアップグレードが必要
  • Moodle 2.0 には上位のバージョンの PHP が必要
  • 恐ろしい Apache のメモリリークの問題に見舞われている
  • 全てのコンポーネントを最新のセキュリティの改善とバグフィックスを含んだものへアップデートすることでベストプラクティスにしたがっている

あなたがやるべきことはこれです。
内容

1 コンポーネントを集める
2 すべてをバックアップする
3 ファイルを配置する
4 データベースをリストアする
5 関連項目

1 コンポーネントを集める

(略)

2 すべてをバックアップする

(略)

3 ファイルを配置する

(略)

4 データベースをリストアする

(略)

5 関連項目

カテゴリ:インストール

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】authorizeResourceを使いつつ未ログインユーザーに特定のアクションを許可する

authorizeResourceメソッドとは

authorizeResourceメソッドを使うと、コントローラーのCRUDアクションに対して、一括してポリシーによる認可制御を適用できます。

app/Http/Controllers/ArticleController/php
<?php

namespace App\Http\Controllers;

use App\Article;
use App\Http\Requests\ArticleRequest;
use Illuminate\Http\Request;

class ArticleController extends Controller
{
    public function __construct()
    {
        $this->authorizeResource(Article::class, 'article');
    }
    // 略
}

authorizeResourceメソッドと未ログインユーザー

authorizeResourceメソッドは便利ではあるのですが、認可されるにはユーザーが認証済みであることが必須であるため、アプリケーションの要件によっては使いづらい場合があります。

例えば、Qiitaでは未登録・未ログインユーザーでも各記事を参照できますが、このように参照系であるindexアクションやshowアクションを未ログインユーザー(ゲストユーザー)でも実行させたいとします。

しかし、authorizeResourceメソッドを使っていると、たとえポリシー側の対応するメソッド(viewAny, view)で一律trueを返していたとしても、未ログインユーザーには403がレスポンスされます。

app/Policies/ArticlePolicy.php
<?php

namespace App\Policies;

use App\Article;
use App\User;
use Illuminate\Auth\Access\HandlesAuthorization;

class ArticlePolicy
{
    use HandlesAuthorization;

    public function viewAny(User $user)
    {
        return true; // 一律trueを返していても、未ログインユーザーは403になってしまう
    }

    public function view(User $user, Article $article)
    {
        return true; // 同上
    }
    // 略
}

認可の条件としてログイン済みを必須としない

認可の条件として、ログイン済みを必須としないようにするにはUserクラスの型宣言をnullable(?User)にします。

app/Policies/ArticlePolicy.php
// 略
    public function viewAny(?User $user)
    {
        return true;
    }
// 略

このようにすると、未ログインユーザーでも該当のアクションを実行できます。

なお、その場合もポリシーのメソッドは実行されますので、

app/Policies/ArticlePolicy.php
// 略
    public function viewAny(?User $user)
    {
        return false; 
    }
// 略

falseを返した場合、未ログインユーザーも403になります。

未ログインユーザーが無条件に認可されるわけではありませんので注意してください。

環境

Laravel 6.x

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

備忘録_レンタルサーバーにLaravelのプロジェクト作って、git管理する

Laravelのプロジェクトを作る

  1. composerが動く環境を用意する

    備忘録_レンタル共用サーバーでcomposerを使う 参照

  2. プロジェクトを作成する

    composer create-project --prefer-dist laravel/laravel ~/{プロジェクト名} "5.8.*"

  3. (動作確認用)

    ln -s {ドキュメントルート} ~/{プロジェクト名}/public

git管理する

  1. さっき作ったプロジェクトのディレクトリに移動

    cd ~/{プロジェクト名}

  2. リポジトリ作る(ついでに、開発用ブランチも作ったりする)

    git init
    git add -A
    git commin -m "init"
    
    git checkout -b developer
    
    mkdir ~/git_repo
    git clone --bare ~/{プロジェクト名} ~/git_repo/{プロジェクト名}.git
    
  3. ローカルに落とす

    git clone {レンタルサーバーのユーザー名}@{レンタルサーバーのSSHドメイン}:git_repo/{プロジェクト名}.git

いやーーーーー

「git clone」とかで調べてもよく分からず詰まってましたが、最終的にgit公式のドキュメントが全て解決してくれました。

【まずは、公式ドキュメントから読む】はマジで癖つけんとアカンです。。。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む