20211127のPHPに関する記事は5件です。

オブジェクト指向を完全に理解するにはwebサイトを例えにすると良い

はじめに オブジェクト指向が分からない、難しいという人が後を耐えないので、 私が一番わかりやすく説明するためにqiitaに舞い降りてきました。 (普段はnoteで自己啓発を書いています) しかし、ネット記事で全てを説明するのは無理なので基本的なところのみになります。 言語はwebサイトを例えにすると分かりやすいと思ったのでphpでやります。 前提1 以下のコードは入門書を3冊読んで用語がなんとなく分かった人向けになります。 前提2 ・そもそもオブジェクト指向は、チームで開発するときに必須。 ・個人開発でも5000行を超えてくると、オブジェクト指向を使わないとしんどくなってくる印象があります。 個人で1000行以下ぐらいのアプリを作っている方は不要だと思います。 マニュアルを読んでも分からない オブジェクト指向は部品と部品を繋いでいくものなのですが、マニュアルでは部品の部分しか書いていないような気がします。 これが難しくなるポイントです。 どうやってくっつけていくの? というところがいまいち入門書を読んでも書いていないので、そこを中心に書いていきます。 接続の方法が分かってくると、「なるほどね」となると思います。 それだけが狙いです。アハ体験しましょう。 マニュアルリンク マニュアルには、トレイト、無名クラス、オーバーロードなどなど用語が並んでいますが、これはオプションみたいなものです。 自動車にカーナビがなくても動くようにトレイトなどは知らなくてもアプリは動きます。 一応一本アプリを完成させたあとで、他の便利な機能を覚えるようにしてください。 ネット記事はオブジェクト指向の例えが下手 上で車の例えを出してしまったのですが、オブジェクト指向全体を車とかロボットとか人に例えると分からないです。 私はwebサイトを例にすることによって直接分かるように工夫しました。 理解を深める5冊 私がオブジェクト指向を理解するために5冊の本を必要としましたので先に紹介しておきます ・なぜ、オブジェクト指向で作るのか?(歴史を知る) ・オブジェクト指向をきちんと使いたいあなたへ (具体的なコードがある) ・Java言語で学ぶデザインパターン入門 ・かんたん UML入門 ・『ThoughtWorksアンソロジー』 (第5章のみ) https://gist.github.com/sambatriste/5535b1f0f6a73e9b37239d86edf61c70 オブジェクト指向がわからないのは、アプリの全体像が分かっていないから プログラミング初心者でアプリを1本も作ったことがない人がいきなりオブジェクト指向を勉強しても無理だと思います。 絵を描くのに似ています。 顔の輪郭や目の描き方だけ学んだところで、どういう人を描きたいのかが決まっていなければ、よく分からないまま終わるでしょう。 アプリ全体を把握してからコードを書くとオブジェクト指向が段々と分かってきます。 つまり、プログラマではなくシステムエンジニアの仕事を理解した方がいいということです。 今回は、みなさまお馴染みのwebサイトを例にしているのですぐ分かると思います。 headerクラス bodyクラス footerクラスです。 このクラス単体なら初心者でも作れるとは思うのですが、 連携させていくのがよくわからないのではないでしょうか? ということで、ここからはコードを使って説明します。 実用性はありませんが、このwebサイトをオブジェクト指向を使って書き直してみます。 index.php <?php echo "ヘッダー<hr>Body<hr>Footer<hr>"; なぜ、headerだけカタカナなのでしょうか? 意味はありません。 書き直すのも面倒なのでこのまま説明します。 php7.4.21で動作確認しています(MAMP) index.phpです。 これがスタートになるというのもphpなら分かりやすくていいと思います。 index.php <?php require_once("class/indexhtml.php"); require_once("class/header.php"); require_once("class/body.php"); require_once("class/footer.php"); $class_array = array(); $class_array[] = new Header(); $class_array[] = new Body(); $class_array[] = new Footer(); new Indexhtml($class_array); このコードが理解できると一気にオブジェクト指向が分かるでしょう。 一番の注目ポイントは、末尾のIndexhtmlクラスに他のインスタンスを引数に入れているところです。 初心者にありがちな、引数には「数値や文字列しか入れられない」という勘違いがあるとその時点で一生オブジェクト指向は分からないままです。 引数にはなんでも入れることができます。 これがオブジェクトとオブジェクトをつなげるという役割になっています。 また、各インスタンスは、まとめて配列に入れています。 これも大事なポイントになります。 配列にインスタンスを入れているので、ループで処理ができるようになりました。 これが出力している部分になります。 Indexhtml.php <?php class Indexhtml { function __construct($class_array){ foreach($class_array as $value){ echo $value->returnhtml(); } } } header、body、footerは共通の関数を持っていないと困る ループがしたいのでそれぞれのクラスは共通の関数を持っていて欲しいです。 ということでインターフェースが登場します。 I_returnhtml.php <?php interface Returnhtml { public function returnhtml(); } このインターフェースは3行だけのプログラムになっています。 では、インターフェースを使ったクラスはどうなるでしょう。 Header.php <?php require_once("./interface/I_returnhtml.php"); class Header implements Returnhtml { private $html; function __construct() { $this->html = "ヘッダー"; } function returnhtml(){ return $this->html . "<hr>"; } } インターフェースによって、returnhtml関数を必ず定義しなければいけなくなっています。 これによってループを安心して回すことができるようになりました。(大事) インターフェースはプログラマ側が間違わないようにしているものなので、別に書かなくても動きます。 さて、ヘッダーと同じようにbodyとfooterも書きましょう。 body.php <?php require_once("./interface/I_returnhtml.php"); class Body implements Returnhtml { private $html; function __construct() { $this->html = "Body"; // $this->side(); } // function side(){ // $side = "| サイドバー追加"; // // $this->html .= $side; // } function returnhtml(){ return $this->html . "<hr>"; } } おっと。コメントが書いてありますね? これは後から頭の尖った上司が 「広告を張りたいからサイドバーを追加しろ!」と言ってきたときのためのプログラムです。 つまり、「オブジェクト指向は後から編集しやすいように設計する」というのがミソなんです。 実際にコメントを消しても実行できますので試してみてください。 オブジェクト指向を使わずに書いた場合は、 一度全てのコードを開くことになり、誤入力などでエラーがでてしまう可能性があります。 オブジェクト指向でファイル毎に分けていれば、bodyファイルだけ編集すればいいことになります。 最後はfooterです。 footer.php <?php require_once("./interface/I_returnhtml.php"); class Footer implements Returnhtml { private $html; function __construct() { $this->html = "Footer" ; } function returnhtml(){ return $this->html . "<hr>"; } } ほとんどheaderと同じですね。 実際はhtmlをゴチャゴチャ書くことになるのですが、今はサンプルなのでシンプルにしています。 一応これでコードの全てを書きました。 ファイル構成はこうなっています。 githubにアップロード? しませんよ classフォルダの中にインターフェースフォルダを入れてもいいのかもしれませんが、本人が分かればどちらでもいいでしょう。 どちらが主流なのでしょうか? 今回はサンプルでありファイル数が少ないのでどちらでもいいと思います。 所詮、オブジェクト指向は、コードを管理してるだけの箱のようなものなので、開発者が分かればいいと思います。 ファイル名の付け方や変数名の付け方も雰囲気で書いたので、あまり細かいところは突っ込まないでいただけると助かります。 実際のwebサイトはどうなっている? ・データベースからheaderのタイトルタグに情報を入れたい ・データベースからbodyの変数に情報を入れたい ・bodyにお問い合わせのフォームが欲しい ・お問い合わせがきたらメールで通知して欲しい などなど仕様は山積みです。 でも1つずつクラス分けして追加していけば大丈夫です。 チームで1つのアプリを作るという前提 1つのファイルでやっていないので、 「俺がbodyやるからお前はheaderとfooterをやって。インターフェース作っといたから後は分かるな」 というように分けることが可能です。 全体像が分かっていれば、後からファイルだけ送ってもらえればガッチャンコするだけですね。 1行のシンプルなコードが長くなりました。意味があるのでしょうか? 元のコードから、かなり長いコードになってしまいましたね。 小分けにしていくと、どうしてもこうなってしまうのです。 ただ上記でも書いたのですが5000行ぐらいになってくるとわかりやすくメリットが出てきます。 また、データベースへの接続やメールなどの機能も1つずつ付けていくことが可能です。 オブジェクト指向のメリットが段々分かってくるといいのですが。 まとめ webサイトの場合はMVCモデルでやるのでしょうかね。 またwebサイトだとCSSやjavascriptなども絡んでくるので、少しややこしかったかもしれません。 しかし、例えをロボットや車にするよりもwebサイトで実際のコードを書いた方が直感的にわかりやすかったのではないでしょうか 私が常日頃思っていた、「オブジェクト指向をロボットや車で例えるなや」と思っていたことを解消するために書きました。 ストレス発散の記事です。 ありがとうございました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

コアサーバーのDB環境をローカルに再現

はじめに  サーバーにサイトをあげる際には、まずローカルのテスト環境で同じものを作って、動作を確認してからサーバーにあげますよね。  私はレンタルサーバーのコアサーバーでデータベースを使っていますが、テスト環境でも同じ仕様のデータベースを作ろうとしました。ただ、コアサーバーでは独自のコントロールパネルを使って、データベースを作るので、ローカルで同じ状況を再現するのには少々苦労しました。  ここに、コアサーバーと同一のmysql環境を構築するまでの道のりを記録として残します。コアサーバー使っている少数の初心者の参考にできればと思います。 環境 サーバー側 コアサーバー :プラン CORE-MINI DB:mySQL ローカル側 ubuntu 20.04 DB:mySQL ①Mysqlへログイン ローカル側  mysql -u root #若しくは sudo mysql コアサーバー側 写真1「データベースの設定画面」 ※個人設定のある枠はぼかしています  コアサーバーのコントロールパネルにログインして「データベース」をクリックするだけなので、何ら難しくない。  ちなみにsshを使ってCUI(黒い画面)からログインもできるが、自身の権限ではデータベースを作成することが出来ない。DBを作るにはコントロールパネルを使うしかないらしい。(もしできるようなら教えて下さいm(_ _)m) ②DBを作りたい ローカル側 CREATE DATABASE データベース名; コアサーバー側 「写真2」DBの作成画面  「DB名」は ローカルsql側で入力した 「CREATE DATABASE ~~」の構文と一致する。パスワードは 次のステップで作るユーザーのパスワードを作ることになる。 ※ちなみにsqlでは、データベースにパスワードはつけないらしい。代わりにユーザーにパスワードを付けている。各ユーザーにアクセスできるデータベースの制限を加えることで、間接的にデータベースを保護しているようだ。  なおコアサーバーでの手続きはこれで完了♫。次の作業であるユーザー作成と権限付与は自動でやってくれる。 ③sqlのユーザーを作る ローカル側 CREATE USER user IDENTIFIED BY 'password' -- user=ユーザー名 'password'=ユーザーのログインパス  これがコアサーバーで言うところ、「写真2」のDB名と、パスワードに一致する。  ちょっとまて、これはユーザー名だろ。データベースはさっき作っただろう?。確かにデータベースはさっき作った。しかし、コアサーバーではデータベース名と、それを使うユーザー名が同一のもので自動生成されるのだ。  逆に言うと、ローカル環境でコアサーバーのデータベースを再現するなら、ユーザー名とデータベース名は同一のものにする必要がある 余談 パスワードの水準チェック  mysqlのデフォルトでは、パスワードの水準は「medium」=「特殊文字使用かつ8文字以上の文字列にする」 になっているはずだ。  別にそれに従えば良い話だが、コアサーバーではパスワードが15文字以下かつ特殊文字は使えない設定になっている(写真2参照)。  つまり、デフォルトの水準に従ったパスワードは、コアサーバーでは受け付けないのだ。私はローカル環境で組んだコードを一切イジらず、そのままコアサーバーに転送できるようにしたい。転送するたびにパスワードを書き換えるのは面倒くさい。。ならば、ローカル環境のsqlさんに簡単なパスワードを許可してもらわねばならない --ローカルのsqlにこの一文 set global validate_password.policy=LOW;  これだけでパスワードの要件が最低に設定されるので、無事ローカル環境でも、コアサーバーと同じパスワードを設定することができる。 ④権限の付与 ローカル側  今作ったユーザーが、今作ったDBにアクセスできるように設定します。多分以下の設定がコアサーバーで与えられる権限と同じのハズ GRANT ALL PRIVILEGES on DBname.* to "usename"@"localhost" -- 'DBname'=データベース名 username=ユーザー名 を代入 php PDOの場合こんな感じでアクセスできます $dsn = 'mysql:dbname=データベース名;host=localhost'; $user = 'ユーザー名'; //user とdbnameは同じでok; $password = 'パスワードを入れる'; $pdo = new PDO($dsn, $user, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));  上手く行けばローカル環境でも本番のサーバー環境でも同じ内容でログインできるようになる。開発者のポリシー的に良いのかはわからないが、本番サーバーに転送する際に、ログイン情報を修正をしなくてよいのは楽だ。 所感  コアサーバーのコントロールパネルは、最小の入力でデータベースが作れるように工夫されている。それ故に、CUIを使って自力でデータベースを作ろうと思った際には少し誤解してしまうところがあった。元よりsqlを触れて、データベースをガリガリ組んでいた人には関係ないだろうが、先にコントロールパネルでデータベースを作っていた人の参考になれば良いと思う。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[PHP] Git Commit 時にコードの整形、静的解析を実行

プロジェクトに整形ツール、静的解析ツールを導入 cd /プロジェクトのパス/ composer require --dev friendsofphp/php-cs-fixer composer require --dev phpmd/phpmd composer require --dev phpstan/phpstan composer update git commit 時に呼び出されるファイル pre-commit の用意 copy .git/hooks/pre-commit-sample .git/hooks/pre-commit pre-commit の編集 vi .git/hooks/pre-commit .git/hooks/pre-commit # 指定ブランチへのpush防止 while read local_ref local_sha1 remote_ref remote_sha1 do if [[ "${remote_ref##refs/heads/}" = "master" ]]; then echo "Do not push to master branch!!!" exit 1 fi done IS_ERROR=0 # PHPコード整形・静的解析 for FILE in `git diff-index --name-status $against -- | grep -E '^[AUM].*\.php$'| cut -c3-`; do if php -l $FILE; then # PHPコード整形 vendor/bin/php-cs-fixer fix $FILE # PHPコード静的解析 if ! vendor/bin/phpstan analyse $FILE; then IS_ERROR=1 fi # PHPコード静的解析 if ! vendor/bin/phpmd $FILE text ruleset.xml; then IS_ERROR=1 fi else IS_ERROR=1 fi done exit $IS_ERROR PHPMD 用 ruleset.xml の編集 vi ruleset.xml ruleset.xml <?xml version="1.0"?> <ruleset name="My first PHPMD rule set" xmlns="http://pmd.sf.net/ruleset/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd" xsi:noNamespaceSchemaLocation=" http://pmd.sf.net/ruleset_xml_schema.xsd"> <description>ルールセットの説明文</description> <!-- ルールの記述 --> <!-- 未使用の変数、メソッド等を検出 --> <rule ref="rulesets/unusedcode.xml" /> <!-- コードの複雑度チェック --> <rule ref="rulesets/codesize.xml/CyclomaticComplexity" /> <!-- メソッド名がキャメルケースかチェック --> <rule ref="rulesets/controversial.xml/CamelCaseMethodName" /> <!-- var_dump()、print_r()等を検出 --> <rule ref="rulesets/design.xml/DevelopmentCodeFragment" /> <!-- クラス/インターフェース定数名が大文字で定義されているかチェック --> <rule ref="rulesets/naming.xml/ConstantNamingConventions" /> </ruleset> ※ git commit 実行時に --no-verify をつけると呼び出されません。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

環境開発#1

参考にしたのは 1-1 VScodeのインストール↓ https://youtu.be/BqGxnmec1i0 2-1 MAMP,Composerのインストール↓ https://youtu.be/8jMnqeCiYDM 2-2 Composerのインストール↓ https://mebee.info/2020/04/17/post-9628/ 最終目標 ローカル環境でVScodeをインストールして、Laravel,MAMPを用いてサイト作成を行う 今回の目的 VScode、GitHub,SQLiteと同期 VScode 導入時 おススメプラグイン Japanese Language Pack 日本語化 Path Autocomplete パス入力支援 Duplicate action ワンクリックコピー vscode-icons アイコンを分かりやすく Bracket Pair Colorizer カッコの色付き Auto Rename Tag 閉じタグも自動修正 Prettier 保存時コードを自動整理 MAMPをダウンロードして、MAMP/htdocsの中にtest.phpを作成し画像表示を試す。 通常ならecho”hello world”が表示されるが、echoに問題があるとエラーが発生してしまい error 500 が表示されてしまう。 そこでecho の前に error_reporting(-1); とエラーを表示しなさい。 を追加するとhello world が表示されるようになった。 おそらくechoがphp構文の初めに来るのが問題なだけで、echoの前になんでもコードがあればよかったと思われる。 ファイルの位置などを動かして試行錯誤した時間を返して欲しい。。。 エラーログはMAMP/logsの中にいた。 MAMPファイル内での動作を確認できたので、次に PHP をインストールする。 インストールは簡単で、PHPのどのバージョンをインストールするかを決めて取り込み、ファイルを解凍させる。 PHPをインストールしたのでPowerShellで php -v を試みたが、 "php" のコマンドのPathがないとエラー連発。 Pathを指定するために、(PHPはここにいます。ここにいるから使ってね。という指定) コントロールパネル➡システムセキュリティ➡システム➡詳細情報➡ システム詳細設定➡システムのプロパティ➡詳細設定➡環境変数➡ ユーザー環境変数➡Pathダブルクリック➡新規➡C:php をしてPHPをインストール成功。 2-1の動画を参考にPowerShellを使用してComposerインストールを試みた。 php.ini-developmentファイルをコピーして、php.iniファイルを作成 その中の;extension=openssl をextension=openssl.dllにして、コメントアウトの有無で調整したが上手くいかない。(通常なら上手くいくらしい。) そこでComposer のインストール方法を変更して2-2を参考にしてみたら、上手くいった。 ※インストールする際は;extension=openssl.dllのコメントアウト状態にしたらインストール出来た。 vscode mamp php composer は準備完了なので、次は、 laravel入れてサイト作成に移る。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

WSL2のubuntuにapacheとphpをインストールしてバージョン管理

この記事は、zennに書いた WSL2のubuntuにapacheとphpをインストールしてバージョン管理 のコピーです。 さこつです。無事退職しました。 XAMPPのアップデートめんどくさい!でも自分のPC環境でphpのバージョン管理したい!!と試行錯誤した結果、 WSL2のubuntuにapacheとphpをインストールすることになったお話。 ubuntuのapacheならラクそう こういう記事があった。ubuntu20.04.1 phpのバージョンを切り替える そうだ、WSL2のubuntuにapacheを入れて管理しよう 1.上記をもとにphpをインストール ただし、2021年11月27日時点でphp8.1をインストールするとapacheが503エラーで動かなくなるので注意。 7.3、7.4、8.0くらいにしとく。 その後、apacheインストール。 apacheのphpバージョン変更はこちら。https://mebee.info/2021/08/02/post-29391/ 2.ドキュメントルート変更 ユーザーディレクトリ内にあったほうがテスト環境としては何かと便利である。 apache2.conf、000-default.conf(のコピー)、default-ssl.conf(のコピー)のドキュメントルートを、 /home/ユーザー名/wwwなどに変更する。 3.ssl設定 せっかくなのでhttpsでアクセスできるようにする。 default-ssl.conf(のコピー)の SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key を SSLCertificateFile /etc/ssl/myssl.crt SSLCertificateKeyFile /etc/ssl/myssl.key とかに変更。 こちら XAMPP for WindowsでSSLを有効にする を参考に、 /etc/ssl/内でopenssl-san.cnfを作成、 openssl-san.cnf $ openssl req \ -newkey rsa:4096 \ -keyout myssl.key \ -x509 \ -nodes \ -out myssl.crt \ -subj "/CN=localhost" \ -reqexts SAN \ -extensions SAN \ -config openssl-san.cnf \ -days 365000 などとした。 ※daysが3650のままでは現状で証明書の期限が切れている。またWSL内なので//CNのバックスラッシュは1つで良い。 4.apache再起動 tarminal sudo a2dissite 000-default.conf sudo a2dissite default-ssl.conf sudo a2ensite 000-default(のコピー).conf sudo a2ensite default-ssl(のコピー).conf のあと tarminal sudo service apache2 restart 5.OKだ 所感 ubuntuだとphpのバージョンアップも apt update でできてホントよい。 なお、ファイルとフォルダのパーミッションに注意。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む