Study / PHP 検索結果

検索件数 : 31

1

こんにちは。明月です。この投稿はphpのcakeフレームワークでerrorページを設定する方法に関する説明です。cakephpでデバッグモードでエラーが発生すると下記とおりのエラーページが表示されます。上の画面はphpで開発する時にエラー追跡するためのstack flowです。すごく有用な情報です。でも、我々が開発が終わった後、本番サーバーに転換する場合にエラーが発生する時、stack flow情報が表示されると困ります。一応、ソースの内容がユーザに見えることになるし、ユーザの立場でエラーページが表示されることはサイトの信頼度を落ちることになるでしょう。そのため、本番サーバーではエラーが発生すれば、エラーページに遷移しなければならないです。そうしたらconfigフォルダのapp.phpファイルを確認しましょう。デバッグ設定するオプションがあります。初期設定は「true」になっていますが、「false」に設定しましょう。また、エラーページを見ると上のページが表示されます。(エラーページを表示するためにはソース上でthrowをするか、要請エラーが発生するページを要請すればよいです。)そうするとエラーページを作成しましょう。先にviewフォルダのappview.phpのソースから修正します。この部分を以前smarty設定する時に説明したことがあります。link - [cakephp] mvcフレームワークのcakeをインストールする方法上のソースをみれば、debugモードじゃない場合、エラーが発生すると「error」ページが表示するように設定しました。「error」ページは各エラータイプ別で設定することも可能ですが、普通は一つのエラーページに統一します。それで我々は「error」ページだけ修正して派生ページは無視しましょう。既存のデフォルトで様々の文法が書いていますね。綺麗にクリアしてエラーページを作成しましょう。appview.phpのコードで応答コードの値を「errormessage」キーとしてテンプレートページに渡しましょう。また、エラーを発生させてエラーページが正しく表示することを確認します。ここまでphpのcakeフレームワークでerrorページを設定する方法に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Study / PHP

作成日付 : 2020/02/20 03:00:00       修正日付 : 2020/02/20 03:00:00

2

こんにちは。明月です。この投稿はphpのcakeフレームワークでtransactionを使う方法とentityクラスを利用してinsert、update、deleteする方法に関する説明です。以前、cakephpのフレームワークを利用せずに、データベースにinsertやupdate、deleteに関して説明したことがあります。link - [cakephp] データベース(mariadb(mysql))を接続する方法でも、我々はデータ無欠性のため、トランザクションを使うし、fetch機能でオブジェクト単位でデータを追加する方法で実装しなければならないです。テーブルの例は以前の投稿を続けて利用します。link - [cakephp] ormのテーブルfetch設定userテーブルでデータを入力する後、派生テーブルのinfoテーブルのデータを入力します。そしてinfo2テーブルのデータを入力することで考えましょう。userテーブルのキーとinfoテーブルの外部キーが自動生成するタイプじゃなく、nvarcharタイプのユーザかuserテーブルのキーとinfoテーブルの外部キーが自動生成するタイプじゃなく、nvarcharタイプのユーザから取得するデータなのでuserテーブルをinsertした後infoテーブルをinsertすることの順番で問題ありません。でも、info2のテーブルの場合はinfoテーブルのキーで外部キーが結んでいますが、この場合は自動生成タイプなのでinfoテーブルがinsertした後、キーを検索してinfo2テーブルに入力しなければならないです。この順番のテーブル入力する作業が多いと思えば、ソースがすごく複雑になるでしょう。また、データベース処理する中でエラーが発生する時、全てをロールバックしなければならないですが、それ時にトランザクション(transaction)を利用すればできるでしょう。cakephpフレームワークではトランザクションがオブザーバーパターンにもう実装されています。javaやc#はパターンを実装しましたが。。トランザクションを利用してデータを入力しましょう。上の例でinfoテーブルの場合は外部キー(id)に入力するデータにはentityデータの「id」で設定するので別にデータベースから受取るのはありませんが、info2テーブルの場合はinfoテーブルの外部キーが自動生成のキ

Study / PHP

#php,#orm

作成日付 : 2020/02/19 03:00:00       修正日付 : 2020/02/19 03:00:00

3

こんにちは。明月です。この投稿はphpのcakeフレームワークでormのテーブルfetch設定に関する説明です。以前にはcakephpでorm query式でデータ検索することに関して説明しました。link - [cakephp] cakeフレームワークでデータベースに接続する時に使うquery式とentityクラス、tableクラス、resultsetorm fetchとはテーブルでreferenceされたテーブルのデータを連結することです。例えば、userテーブルに派生テーブルinfoがあり、infoテーブルでuserテーブルのidをforeign keyで結ばれたと思えば、プログラムからuserテーブルを検索するとinfoテーブルのデータもリストタイプに検索される機能です。1:1の関係ならクラス内部で一つのインスタンスで変数に派生テーブルデータがあり、1:n関係ならリストタイプでデータがあります。javaのormでも同じ概念で説明したことがあります。link - [java] jpaのentityクラス設定(cascade, fetch)テストのため、データベースにテーブルを新しく生成しましょう。テーブルの生成が完了したらcakephpにもtableクラスとentityクラスを生成します。cakephpの機能ではfetch機能でjoinを利用してデータを取得する方法にもあります。link - https://book.cakephp.org/3/ja/orm/retrieving-data-and-resultsets.html#changing-fetching-strategiesでも、joinを利用する方法はすごく複雑です。entityクラスで処理することじゃなく、controllerで$table->find()関数を利用してデータを取得することに紹介しています。ormでデータを組み込むことじゃなく、controllerがデータによって複雑に実装することだけです。それでfetch設定をしてデータを取得するように実装しました。link - [cakephp] cakeフレームワークでデータベースに接続する時に使うquery式とentityクラス、tableクラス、resultset一応、permissionは後で説明して上のinfoだけ確認します。infosのプロパティのデータを

Study / PHP

#php,#orm

作成日付 : 2020/02/18 03:00:00       修正日付 : 2020/02/18 03:00:00

4

こんにちは。明月です。この投稿はphpのcakeフレームワークでデータベースに接続する時に使うquery式とentityクラス、tableクラス、resultsetに関する説明です。以前にcakeフレームワークでデータベースを接続する方法に関して説明しました。link - [cakephp] データベース(mariadb(mysql))を接続する方法cakephpにはormフレームワークが含めているので簡単にデータベースに接続するしクエリを構成してデータを検索することができます。cakephpのormはデータを取得する時に単純にsqlクエリじゃなく、query式という関数があります。それでstringタイプのクエリじゃなく、php言語の関数みたいにクエリを組立てすることができます。上の例をみればc#のlinq式とjavaのstream式とすごく似てます。ここまでは以前の投稿にも説明しました。差があるといえば以前は$connection->newquery()関数でquery式を取得しましたが、今回はtableregistryからレジストリを取得してfind関数でquery式を取得しました。connectionのnewqueryとtableregistry:getしてfind関数で取得することは文法は別に差がなさそうですが、実際にnewqueryはsqlクエリを組立てするために関数ならレジストリから取得したことはorm上でデータをオブジェクト化することです。単純にみてもnewqueryはコネクションのオブジェクトで扱うことなのでリソース管理をみても良くないでしょう。そうするとデータをオブジェクトにするようにtableクラスとentityクラスを作成します。ideのdirectory explorerをみればmodelのフォルダの中にentityフォルダとtableフォルダがあることを確認できます。クラス名は「テーブル名+table」になります。私の場合はテーブル名が「testtable」なので「testtabletable」という可笑しい命名になりました。クラス名は必ず「テーブル名+table」という命名方法に従う必要はありませんが、必ず語尾に「table」は付けなければならないです。そしてentityクラスをentityフォルダに作成します。entityクラスはテーブル名のままになります。他

Study / PHP

作成日付 : 2020/02/17 08:16:23       修正日付 : 2020/02/17 08:16:23

5

こんにちは。明月です。この投稿はphpのcakeフレームワークでデータベース(mariadb(mysql))を接続する方法に関する説明です。以前、バニラphpバージョンでmysqliのモジュールを拡張してデータベースに接続、検索、格納、削除などに関して説明したことがあります。link - [php] データベース(mariadb)を連結して使う方法cakeフレームワークでデータベースを接続してデータ管理することは以前バニラphpバージョンよりいいです。ormフレームワークでデータを管理するし、取得することもc#のlinq式みたいな感じの実装するので接近性がよくなりました。link - https://book.cakephp.org/3/ja/orm/database-basics.html先にデータベースにクエリを作ってデータを準備しましょう。以前にテストで使ったデータをそのままに使います。そしてデータベースに接続するために設定情報ファイルを修正します。設定情報ファイルはcakeフレームワークのconfigフォルダの中にapp.phpファイルがあります。app.phpファイルの中でデータベースコネクション情報を設定するところがあります。それをデータベース設定環境に合わせて修正します。データベース設定が完了したらhomecontrollerのクラスからデータベースのデータを取得します。上の結果をみれば、データベースからデータを取得したことを確認できました。上のクエリをみれば、単純に「select * from testtable」式を飛ばしてassocを連関配列で取得したことで以前の方式と別に差がありません。上の例をみれば$connectionからクエリオブジェクト$($query)を受け取ります。$queryオブジェクトは「from」、「where」、「order」、「select」の関数でクエリを組み立てます。この関数は「excute」関数で組み立てるので順番が変わっても結果は同じです。fetchallでデータベースからデータを受け取ります。結果はidxが偶数だけあります。60の場合は10倍数なので「new!!!」変更されたことを確認できます。$connectionにはinsert、update、deleteの関数があります。insertの場合は初めのパラメータはテーブル名で2つ目は連関配列によってデ

Study / PHP

#php,#cakePHP,#database

作成日付 : 2020/02/14 03:00:00       修正日付 : 2020/02/14 03:00:00

6

こんにちは。明月です。この投稿はphpのnamespaceとuseキーワードに関する説明です。現在cakephpフレームワークに関する分析や説明をしていますが、急にphp基礎文法に戻りました。実はphpの中でnamespaceやuseをよく使いならソース管理に良いですが、ライブラリ開発じゃない以上、すごく大事なところじゃなかったので省略しようと思いました。でも、やはりmvcモデルで開発するためにはパッケージ区分が必要と思って説明します。namespaceとuseとはc#の場合はnamespaceとusing、javaの場合はpackageとimportと同じ意味です。最近、プロジェクトサイズが以前より大きいし様々なライブラリを参照しています。それでクラス名をプロジェクト中で雄一なことに決めることが難しいです。例えば、データベースを2つを扱うプロジェクトということに考えてみましょう。そのデータベースの種類がmysqlとoracleといえばrdbmsのタイプなのでライブラリがすごく似ていると思います。そのため、コネクションするクラス名がmysqlライブラリは「connection」という名を、oracleライブラリでも「connection」と実装されていると思えばユーザがconnectionクラスを割当てする時にプログラムはどのconnectionを宣言するか競合エラーになるはずです。他の例ではxmlデータを扱うライブラリでオブジェクトを作成するbuildクラスがあるし、jsonデータを扱うライブラリでもオブジェクトを作成するbuildクラスがあると思えば、buileクラスを割当てする時にプログラムはどのクラスを宣言するかを分からないです。そうすると、全てもphpのライブラリのクラス名は固有名で作成しなければならないですが、現実的にありえないことでしょう。同じクラス名でも区別するためにnamespaceがあります。useの場合はnamespaceをパッケージを使用する明示的に宣言することです。上の例はtestclassが2つあります。namespaceは各test1とtest2にあるので、別のクラスです。もし、namespaceを使ってないなら同じクラス名が重複されたというエラーメッセージがでます。エラーメッセージが出ない(エラーオプション設定で。)と言ってもcontrollerでtestclassを割当て

Study / PHP

#php,#namespace,#use

作成日付 : 2020/02/13 03:00:00       修正日付 : 2020/02/13 03:00:00

7

こんにちは。明月です。この投稿はphpのcakeフレームワークのrequestとresponseに関する説明です。requestとはウェブブラウザからウェブサーバに要請したデータ(headerとbody)です。responseとはウェブサーバからウェブブラウザに応答するデータ(headerとbody)です。要請するタイプには「get」タイプと「post」タイプがあります。そのことでgetのquery stringは「$_get」から取得するしpostのform dataは「$_post」から取得することを説明したことがあります。また、headerのデータは$_serverから取得することも説明しました。link - [php] $_server, $globals, $_get, $_post, $_request, $_cookie, $_session, $_files, $_env(getenv())以前、説明したデータをcakephpフレームワークでももちろん使えます。でもデータ流れの構造を設計、管理するcakephpフレームワークを使っているから内部オブジェクトでheaderデータを取得しましょう。link - https://book.cakephp.org/3/ja/controllers/request-response.htmlrequestウェブブラウザからウェブサーバに接続する時の要請上です。ヘッダ情報や、セッション情報があります。$this->getrequest()->getattributes()と$this->getrequest()->getparam(キー)getparamの関数の情報はgetattributesの「params」のデータになっています。実はgetattributes()関数はroutes.phpからcontrollerを呼出す時にデータを渡すパラメータです。上の例の場合はcontroller、actionしかありませんが、connect関数にパラメータを付けるとgetattributes()関数で取得ができます。$this->getrequest()->getquery()このデータはhttpメソッドがgetの時に受取るquery stringの値です。参考にgetque

Study / PHP

#php,#request,#response

作成日付 : 2020/02/12 03:00:02       修正日付 : 2020/02/12 03:00:02

8

こんにちは。明月です。この投稿はphpのcakeからajax要請がある時、jsonタイプ(json_encode関数)でresponseする方法とcontrollerでviewを選択する方法に関する説明です。前の投稿でcake+smartyの組み合わせでウェブブラウザから要請がくるとcontrollerを通ってviewを読み込んでresponseする方法に関して説明しました。link - [cakephp] mvcフレームワークのcakeをインストールする方法ウェブサービスでは必ずhtmlドキュメント形式でresponseすることじゃありません。例えば、ajaxの機能ならjsonタイプのデータを受取る時もあるし、ファイルをダウンロードする時もあります。その時にはactionメソッドでリターン値がテキストやバイナリタイプで受け取ってブラウザ側にresponseしなければならないです。javaだとresponsebodyアノテーションを設定してstring値にリターンすることと同じ意味です。これからactionメソッドからajax値を受け取りましょう。controllerを追加します。ajaxcontrollerを追加してajaxデータを生成します。上の例でjson_encodeの関数はarrayをjson形式に変換する関数です。参考にobjectタイプはjsonタイプに変換しません。java(gson)やc#(newton)はライブラリに提供しますが、phpの場合は内部関数で提供します。phpの長所は細かい内部関数が多いことです。別にライブラリがなくてもプログラムを立ち上げることで無理がありません。また、ソースに戻してhomeのindexのビューでjavascriptでajaxを呼出す関数を作って確認しましょう。ajaxから「/ajax/index」を呼出します。ajaxcontrollerのindex関数が呼ばれます。jsonタイプで要求しています。idがdataのオブジェクトにはjsonのdataの値を、data1のオブジェクトにはjsonのdata1の値を入れました。actionメソッドのリターン値で許すデータはnullと$this->response値だけです。その以外のデータはエラーが発生します。そうするとcontrollerのactionとテンプレートのファイル名はいつも一致しなけ

Study / PHP

#php,#ajax

作成日付 : 2020/02/08 03:00:00       修正日付 : 2020/02/11 20:15:22

9

こんにちは。明月です。今まで、reflectionやspl_autoload_register、smarty、.htaccessなどを説明しましたが、それは全てphpのmvcフレームワークを構成するための準備作業だと言えます。cakeとはphp側で有名なフレームワークです。javaだとspring、c#だとmvc frameworkと似ているな概念のmvcフレームワークです。link - https://cakephp.org大勢方がcakeフレームワークがどんなフレームワークより使いやすいし、様々機能があってセキュリティやデータ管理などが強いといいますが、個人的にjavaとc#のフレームワークに馴れているからかな、以外に複雑ですね。実はこの投稿を作成しながらもずいぶん迷ういました。一応、目標として、インストールまで完了してブラウザに「hello world」を出力することで始まります。cakeフレームワークを使うためにはいくつかのモジュールを設定(extension)しなければならないです。php.iniを確認しましょう。上の3つのモジュールのコメント(;)を解除されていることを確認しなければならないです。解除されているのを確認したらcomposerでcakeフレームワークをダウンロードしましょう。link - [php] composer設定私の場合は一回ダウンロードした状況なので「loading from cache」で表示されます。初めにダウンロードするとライブラリが少しありますので、時間がかかります。フォルダを見ればappフォルダがあることを確認できます。私の場合はrootで作業するつもりなのでappフォルダにあるファイルを全てrootフォルダに移動します。そして.githubフォルダとappフォルダは必要ないので削除しましょう。そしてcakeフレームワークもビューのテンプレートがありますが、我々はsmartyテンプレートに変わりましょう。(cakeのテンプレートは別にphpスクリプトファイルと差がないです。)composer.jsonのrequireにsmartyライブラリを追加しましょう。link - [php] phpのコーディング領域とデザイン領域を分離するテンプレートライブラリ smartyそのあとでcomposer updateをしましょう。ここでcakeフレームワークを使うための準

Study / PHP

#php,#CakePhp

作成日付 : 2020/02/07 03:00:02       修正日付 : 2020/02/07 03:00:02

10

こんにちは。明月です。全樹でrequireとincludeに関して説明したことがあります。link - [php] requireとinclude、そして「@」の使用方法筆者が考えてphpでプログラミングする時に、一番不便なことがrequireとinclude宣言です。小さいプロジェクトならそんなに不便とは感じられない可能性もありますが、大きいプロジェクトなら様々なところでクラスを呼出すし関連ページを全て呼び出さなければならないので、すごく大変になるでしょう。javaやc#の場合はパッケージ単位、namespace単位で宣言します。それでもソースの上にimportやusingキーワードが多くなることがあります。まして、クラス単位であるphpページならすごく多くなるでしょう。筆者は以前に参加したプロジェクトでrequireだけで何百行目になったことも見たことがあります。これを解決する関数で「spl_autoload_register」ということがあります。実はこの関数はphp 5.3から提供していますが、筆者の場合は「7.0」から認識しました。それで以前にはphpの場合はパッケージ管理が難しいという認識がありましたが、実はそれじゃなかったんです。やはり、ソースパフォーマンスや可読性は開発者の能力の違いですね。言語は以前から提供しましたが。。。link - https://www.php.net/manual/en/function.spl-autoload-register.php上の例をみれば、ページの中でクラスだけあるファイルは「.class.php」の拡張子で作成しました。これは標準規約じゃなく、私が楽に区分するように決めた規則です。ソースでspl_autoload_registerの関数以外にはincludeやrequireがありません。でもclass1をインスタンス生成する時(newで割当て)、spl_autoload_registerの関数が呼出してclass1.class.phpファイルを読み込みます。ここでinclude_onceで読み込みましたので重複読み込みはありません。class1クラスはextendsキーワードでabstractclassを経書しました。それで「abstractclass.class.php」ファイルも読み込みました。class2.class.phpの場合は、「abs

Study / PHP

作成日付 : 2020/02/05 03:00:00       修正日付 : 2020/02/05 03:00:00

11

こんにちは。明月です。今回はphpの匿名関数(ラムダ)とクロージャに関して調べてみました。匿名関数は既存phpで宣言した「function methodname($param)」の形じゃなく、「function($param)」という関数名がないことです。関数名がないというのは一回性の関数で「javascript」とコールバック関数とにみたいな流れの関数です。上の例をみればruntest関数に2つのメソッド名がないメソッドを渡します。この関数では「$add」と「$substract」に結果を渡すための一回性の関数です。クロージャとは「java」と「c#」、「javascript」のクロージャと同じ概念です。クロージャと言うのは関数内部じゃないところで宣言した変数を関数の中で使えることです。実際にメモリ上では別のメモリ領域なので共有ができないですが、ソース上でメモリを共有するような機能になっています。上の例をみれば$message変数に「hello」という値を入力しました。各匿名関数「$example1」と「$example2」を作成しました。$example1の関数では「$message」変数を参照するとエラーが発生します。エラー内容は宣言してない変数使用ということになっています。なぜなら$messageの変数は$example1関数外で宣言したものからです。でも、$example2では$messageを使いますね。useキーワードを利用して関数外の変数を使えるようにしたからです。link - https://www.php.net/manual/en/functions.anonymous.phplink - https://www.php.net/closure

Study / PHP

作成日付 : 2020/02/04 03:00:00       修正日付 : 2020/02/04 03:00:00

12

こんにちは。明月です。今まで、我々はphpを作成する時にphpコードとhtmlコードを混ぜて作成しました。簡単な仕様ならhtmlデザインパートとスクリプトパートが一緒にあるから楽かも知りませんが、少し複雑になるし大きくなるとソースコードが複雑になるでしょう。昔はphpにもクラス概念がある前には単一ページ作成方法(phpスクリプトとhtmlコードが混在)でよく作成しました。(必ずそのことではないけど、普通はそうだったです。)最近はhtmlタグ構成、cssスタイルコード、javascriptコードも複雑になってその上でphpコードまであるとすごく複雑なソースことになるでしょう。開発する時に可読性は重要な部分なので、その時にはスクリプトコードとhtmlコードを分ける必要があります。java(spring)やc#(mvc)にはmvcモデルのフレームワークがあります。mvcモデルとはmodel(オブジェクト)、view(htmlデザイン)、controller(ロジック)を分けて作成する方法です。phpにもcakeというmvcモデルがあります。でも、cakeにもコントロールとビューが分けていますが、ビューがphpコードになっているので、完全な分離だと思いません。それでphpにはテンプレートフレームがありますが、それがsmartyとtwigです。筆者はtwigよりsmartyが手に慣れているので、smartyを使っています。smartyとtwigは使用方法が全然違うテンプレートですが、パフォーマンスや概念は似ています。link - https://www.smarty.net/smartyを利用するためにcomposerでsmartyをダウンロードしましょう。repository - https://packagist.org/packages/smarty/smartyeclipseのexplorerでたまにエラーマークが表示される時があります。実際にエラーではないので気にしなくてもよいです。eclipseがphpソースを完全に解読できないらしいです。index.phpファイルでsmartyクラスを宣言してテンプレートディレクトリ設定をします。キャッシュ設定もありますが、しなくても構いません。その後、smartyインスタンスでdisplay関数で「index.tpl」ファイルを読み込みます。phpファイルでhtml

Study / PHP

作成日付 : 2020/02/02 03:00:00       修正日付 : 2020/02/02 03:00:00

13

こんにちは。明月です。前述でreflectionのclassとmethodを扱う方法に関して説明しました。link - [php] reflection - class編link - [php] reflection - method編reflection機能はプログラムを動的に実装するように使うこともありますが、テストのために使うこともあります。特にreflectionの変数を扱うことではクラスのメンバー変数に直接に参照と修正ができるのでそれぞれのテストケースを作ってunitテストが可能です。その話はコンパイルが可能なjavaとc#の話です。phpはコンパイルが必要ないスクリプト言語なので、実は私の考えではreflectionのvariable機能はそんなに必要が無いと思います。クラスのデータの流れを確認するようにはvar_dump関数を利用するとprivateデータまでよくみえるからもっと使うところがないと思いますね。普通はクラスを作れば変数はprivateに設定するほうが基本コーディング規約です。なので、privateタイプの変数にデータを格納、取得することだけ知れば良いと思います。上の例をみれば、exclassの中で「data」のメンバー変数はprivateに設定されています。まず、そのデータを取得するようにexclassのインスタンスを生成します。getproperty関数で変数のオブジェクトを取得してsetaccessible関数で「private」のアクセス修飾子を無効化します。bodyタグの中でgetvalueを利用してobjのインスタンスのdata変数を取得して出力します。取得しましたから今回は格納してみましょう。上の例はインスタンスをreflectionで生成したことじゃなく、newキーワードで生成しました。普通の文法ならインスタンスを「new」で生成します。getvalueでメンバー変数を取得できたら、setvalueではデータが格納できます。結果はexclassのdata変数は「change」という値に変更されたことを確認できます。link - https://www.php.net/manual/en/class.reflectionproperty.phpreflectionまで纏めて説明しました。次の投稿からは.htaccessと上のreflectionを利用してapache

Study / PHP

#php,#reflection

作成日付 : 2020/02/01 03:00:00       修正日付 : 2020/02/01 03:00:00

14

こんにちは。明月です。前述でreflectionでクラス<を探してインスタンスを生成する方法、インスタンスの中で変数や関数を探す方法まで説明しました。link - [php] reflection - class編今回はreflectionを利用してクラスで関数を探して実行する方法まで調べてみます。上の結果をみればquery stringのパラメータによって呼出す関数を違うし結果も別で表示されます。もし、reflectionがなければ下記とおりに作成したと思います。ここでexclassのクラスの関数が仕様によって増えると考えば「if ~ else」も増えますよ。上の場合は簡単な例なので差をそんなに体感されないですが、拡張的に考えたらもっと複雑なプログラムならすごく複雑なロジックになるでしょう。reflection機能でこの関数を動的に呼出すだけではないです。関数がpublicではないアクセス修飾子も呼出すことができます。上の例をみれば「test2」と「test3」関数はpublicではなく、privateやprotectedに設定されています。そうすると基本的にクラス外部では呼出すことができません。でも、reflectionの「setaccessible」関数を利用してアクセスができるように設定して呼出しました。phpの場合はクラスのメソッドのオーバーロード(同じメソッド名にパラメータのタイプと個数で関数を区別すること)がありません。それで特にreflectionでメソッドを検索する時にパラメータのタイプや個数の情報はいらないです。invoke関数を呼び出す時にパラメータの数が一致しないとエラーが発生するため、パラメータの検証が必要になる場合があります。phpの場合は別に変数の型がないので、変数名と個数で検証処理をすれば良いと思います。link - https://www.php.net/manual/en/class.reflectionmethod.php

Study / PHP

#php,#reflection

作成日付 : 2020/01/31 03:00:00       修正日付 : 2020/01/31 03:00:00

15

こんにちは。明月です。reflectionは以前javaとc#でも説明したことがあります。link - [c#] reflection(リフレクション)link - [java] reflection - class編reflectionとはプログラム構造を投影して再構築する方法のプログラム技法です。その意味は我々がクラスを「$obj = new class()」形で宣言しますが、その宣言するクラスを動的宣言方法で使いたいことです。つまり、パラメータで「aタイプのクラスを宣言して」というデータがあればaタイプクラスを、「bタイプのクラスを宣言して」というとbタイプのクラスを宣言することです。上の例はreflectionではなく、我々がよく知っている形でクラスを宣言した方法です。パラメータでaを受取るとaクラスを宣言するしbを受取るとbクラスを宣言します。普通だし、問題ないプログラムコーディングですが、もしクラスがaクラス、bクラスだけではなくたくさんある場合にはどうでしょうか?後、プロジェクトが大きくなるほど上のパラメータが増えると言えばどうでしょうか?その時には「$obj = new $type.class()」の形で作成したらどうかと思う時がありますね。それがreflectionです。上の例ではパラメータから「type」を受け取ってreflectionを利用してクラスを宣言しました。結果はブラウザのアドレスにquery stringの「type」に「a」を入れるとaclassのprintを呼出して「aclass」という結果が表示されました。「type」に「b」を入れるとbclassのprintの関数で「bclass」の結果が表示されました。reflectionの「getproperties」と「getmethods」の関数でクラス内部のメンバー変数と関数の構成を確認できます。上の結果を見ると変数には「data」が表示するし、関数には「print」、「test」、「get」がみえます。アクセス修飾子も関係ずにデータがすべてみえますね。でもアクセス修飾子の情報と関数の場合はパラメータ返却情報がないですね。実はあるのに、私がまだ知らない状況の可能性もあります。link - https://www.php.net/manual/en/class.reflectionclass.phpreflectionに関し

Study / PHP

#php,#reflection

作成日付 : 2020/01/30 03:00:00       修正日付 : 2020/01/30 03:00:00

16

こんにちは。明月です。前述でphpでエラーメッセージを処理する方法に関して説明したことがあります。link - [php] fatal及びnotice,、warningメッセージ処理する方法プログラムを開発する時にはこのエラーメッセージは重要です。エラーメッセージを見て間違ったことを修正するし、予想以外が発生することを確認しなければならないです。でも、本番のサービスは違います。実際にインタネット上でエラーが発生することだと思えばログではエラーを残るけれども、画面上ではみえないようにしなければならないです。一番、いい条件は初めからエラーが発生しないことがよいですが、全てのユーザの行動パターンを予測できないし作業者のミスや様々な条件で、エラーが必ず発生します。なので、本番でエラーメッセージが見えることは実際にエラーメッセージでシステム情報や見えたらためな情報が見える可能性もあるし、ユーザがみて完成になれなかったことで見えるのでユーザによってサイトの信頼感が落ちることになります。サイト内でエラーが発生するとエラーページに遷移しなければならないですが、その設定を「.htaccess」で設定可能です。link - [php] 分散設定ファイル(.htaccess) 使用方法link - httpステータスコード(エラーコードをみながらみると理解しやすいです。)上のエラーは我々がよく知っている「404」エラーに関して対応しました。404エラーはウェブページで当該なページが無い場合に発生することです。先「.htaccess」をみれば「404」エラーが発生すると「/error?code=404」にrewriteします。また、rewriteruleによって「index.php?htaccess=error&code=404」に変換して遷移します。index.phpの中でエラーがある場合にエラーコードによってページを読み込んで画面に掲示します。imageフォルダ中で実際に「test」ファイルは存在しません。なので「404」エラーが発生します。上の例はサーバ上でエラーが発生したことで、ソース内部でエラーが発生する時の処理です。上の例はパラメータがnullかどうかでエラーが表示されるように実装しました。上の結果はdataのパラメータに「1」というデータを入れるとhttp statusが200になりますね。200は

Study / PHP

#php,#ob_clean,#die

作成日付 : 2020/01/29 03:00:00       修正日付 : 2020/01/29 03:00:00

17

こんにちは。明月です。前述まではブラウザでphpファイルを接続しようと思ったら「ホスト名+ファイル名」で接続しました。つまり「index.php」ファイルを作成したら「http://localhost/index.php」で接続しました。そのままにウェブサービスを開始しても問題ないですが、phpファイルでクラスだけあるファイルなら空ページが見えるし、ウェブサービス側のディレクトリが漏れるのでセキュリティに考えては良くないです。そうしたら直接にファイルを接続する方法ではなく、c#のmvcみたいにアドレスのディレクトリだけでphpを接続できるような設定ファイルがありますが、それが分散設定ファイル(.htaccess)です。link - https://httpd.apache.org/docs/2.4/en/howto/htaccess.html先に分散設定ファイルを使うように「.htaccess」の構造に関してしらべましょう。上のイメージみたいにファイル名はなしで拡張子だけ「.htaccess」に生成しましょう。options -multiviewsこのオプションはrequestデフォルト要請設定と関係があります。要請urlがルート(root)、つまり「ホスト名/」で要請すると「index.php」や「index.html」を探す機能です。そのデフォルトページは「httpd.conf」に設定しています。「options +multiviews」にすると当該な機能が設定されますが、「options -multiviews」にするとデフォルトページを探さないです。rewritebase /rewritebaseはサーバのルート(root)ディレクトリを設定することです。基本的に「httpd.conf」で設定されている「documentroot」でルートに設定されていますが、フレームワークによって下位ディレクトリに設定する場合に設定することです。上の例では詳細していますが、詳細した場合は「httpd.conf」に設定しているままで動きます。rewriteengine onrewriteengine onは既存のurlパス構造を再構成してurlからデータを受取ることです。例で「localhost/index.php?idx=1」のurl要請があります。index.phpページにget方式のidxパラメータに1を入れ

Study / PHP

#php,#.htaccess

作成日付 : 2020/01/28 03:00:00       修正日付 : 2020/01/28 03:00:00

18

こんにちは。明月です。ウェブサービスを開発すると思ったら当たり前にデータベースも使います。もちろん、データを必ずデータベースを使うことではなく、バイナリやエクセルなどでもデータを管理してウェブサービスを立ち上げられます。でも、データベースよりデータ管理しやすいものでは無いので、データベースをほとんど使うと思います。データベースの種類としてはoracleやsql server(mssql)、mysql、postgreなど様々な種類がありますが、ここではmariadb(mysql)を使います。mysqlのインストールは省略します。link - [ubuntu] mariadb(mysql)をインストールする方法link - [centos] mariadb(mysql)をインストールlink - window用ダウンロードsqlクエリは各キーワードは差がありますが、概念は同じです。phpでデータベースを使うようにはphp.iniを修正しなければならないです。php.iniの中で「extension=mysqli」がありますが、この部分のコメント(;)を除いてapacheを再起動します。そしてphpinfo()で確認すると「mysqli」がロードされたことを知ることができます。一応、phpからデータ取得するソースを実装するため、データベースにデータを挿入しましょう。データを作成しました。上のデータをphpからデータを取得しましょう。phpからデータベースを接続するようにはmysqli_connectでコネクションを作ります。データベースコネクションはioのコネクションみたいにリソースなので最後には必ずリソース返却(close)しなければならないです。コネクションを作った後、データベースを選択します。クエリでは「use データベース」と同じです。そして「mysqli_query」関数でクエリを送るし結果を受け取ります。この例ではmysqli_fetch_assoc関数を使っていますが、mysqli_fetch_rowでも受け取ることが出来ます。これは一般配列か、連関配列かの差ですが、mysqli_fetch_rowで一般配列(数字で探索)で結果を受け取られるし、mysqli_fetch_assocはカラム名のキーで連関配列で結果を受け取られます。phpでは連関配列でも一般配列みたいに数字でデータを取得することがで

Study / PHP

#php,#mariadb,#db connector

作成日付 : 2020/01/24 03:00:00       修正日付 : 2020/01/24 03:00:00

19

こんにちは。明月です。i/oとはinput/outoutという意味ですが、プログラムでi/oというとファイル入出力という意味になります。プログラムを作成してみればpropertyという環境ファイルを読み取りする時もあるし、クライアントにファイルを転送するために読み込む時もあります。逆にプログラム上でログやデータをデータベースではなく、ファイルで格納するしブラウザからファイルをアップロードされ、ファイルを書き込む時もあります。そして同じフォルダにある「data.txt」ファイルを読み取ります。ここで「data.txt」ファイルには改行がありますが、ウェブページには一行目で表示されます。参考にウェブブラウザは改行が「<br />」タグなので、バイナリの「\r\n」や「\n」はブラウザで改行されません。fopenはファイルコネクションを生成してファイルを開いてfreadでファイルを読み取りします。最後にfcloseで必ずリソースを返却しなければならないです。そうではなければプログラム上でi/oリソースをずっと使用中になるので、他のセッションで使えなくなります。phpはスクリプトなのでrequest&response単位でリソースを自動に返却しますが、プログラムパフォーマンスのため、使用が終わったらすぐリソースを返却しましょう。今回はファイルを書き込みしましょう。初めにファイルを読み取る時にはfopen関数でパラメータを「r」を使いました。また、書き込む時には「a」を使いました。上のパラメータはファイルのコネクションのタイプを選べることです。 モード 説明 r 読み取り専用。ポインタは最初です。 r+ 読み取り + 書き込み。ポインタは最初です。 w 書き込み専用。 ファイルは初期化になります。ファイルが存在しないなら作成します。 w+ 読み取り + 書き込み。ファイルは初期化します。ファイルが存在しないなら作成します。 a 書き込み専用。ポインタは最終です。 a+ 読み取り + 書き込み。ポイン

Study / PHP

#php,#io

作成日付 : 2020/01/23 03:00:00       修正日付 : 2020/01/23 03:00:00

20

こんにちは。明月です。プログラムプロジェクトを管理するようにはディレクトリやファイルの構成を設定することも重要な部分です。例えば、javaの場合はパッケージネームがディレクトリ構造でクラス名とファイル名を一致させておいてクラスを早く探せるように設定します。c#の場合もnamespaceがディレクトリ構造でクラス名がファイル名と一致させます。上のルールは必ずではないけど、できれば守らなければならないです。phpの場合は.phpがウェブページなのでクラス名とファイル名を一致することで少し難しい部分があります。でも、できれば合わせることは将来に可読性のため必要です。そして、最近のプロジェクトは.phpで全開することではなく、.htaccessを利用してmvcモデルに構成するのでクラスようなファイル(.php)とビューファイル(.tpl)を分けることにしますね。なので、phpもクラス名とファイル名、ディレクトリ名とnamespace名に分けることができます。そうしたら2つのウェブページを生成して一つのresponseに作りましょう。index.phpファイルとextension.phpファイルを生成しました。index.phpファイルで「require」関数を利用してextension.phpファイルを読込みました。extension.phpファイルはクラスしかないので、ブラウザで「localhost/extension.php」に接続しても空ページが表示されます。しかしindex.phpではextensionクラスを宣言してgetdata関数を呼出すので、「localhost/index.php」では結果が「hello world」が表示されますね。そうすると「require」の使用方法に関しては理解しました。上のindex.phpで「require」キーワード代わりに「include」を入れても同じ結果ができます。「require」と「include」の使用方法と結果は同じです。でも、includeする時あるいはrequireする時にファイルがあるかどうかでエラーの差があります。上の場合はブラウザで「localhost/index.php」に接続するとエラーが発生します。fatalエラーなのでスクリプト解析が止まるのでbodyにある「go!!」も文言が表示されないです。includeの場合はエラーではなく、警

Study / PHP

#php,#require,#include,#@

作成日付 : 2020/01/22 03:00:00       修正日付 : 2020/01/22 03:00:00

21

こんにちは。明月です。プログラムを開発する時に様々なエラーが発生することがあります。それでtry〜catchを利用してエラー処理をしますが、開発する時に全てのユーザケースを考えることも大変だし、try~catchでも処理ができなくphp側のエラーが発生する時があります。例えば、ページincludeやrequireする時ですね。また、phpはエラーではなくてもwarningやnoticeメッセージが出る時もあります。上の例は1から0で割り算をするとエラーが発生することと$data1の場合はデータ宣言もしなかったのに出力しようと実装したから発生したメッセージです。(上と下の結果の差はxdebugを設定したかどうかの差です。)link - phpでxdebugを設定する方法開発中でエラーが発生するとエラーメッセージが出るのは当たり前ですが、サービスのproduction(本番)でエラーの詳細情報がでるのはngですね。エラーメッセージだけではなく、noticeやwaringもngですね。そのメッセージが画面上で表示されないような方法です。php.iniで設定する方法php.iniファイルをメモ帳で開くとerror_reportの領域があり、e_allで設定されています。e_allの意味は全てもメッセージを表示する設定です。 エラーレベル 説明 e_all すべてのメッセージと警告 e_error 致命的なエラー e_recoverable_error ほぼ全てエラー e_warning 警告 e_parse コンパイル単位のエラーphpのdllの関数のエラー e_notice noticeレベルのメッセージ e_strict noticeレベルのメッセージ、phpの以前バージョンの関数で新バージョンのおすすめ(?)のメッセージ e_core_error

Study / PHP

#php,#error_reporting

作成日付 : 2020/01/19 03:00:00       修正日付 : 2020/01/22 20:37:23

22

こんにちは。明月です。前述でphpでデバッグする方法に関して説明したことがあります。link - [php] データ確認関数(var_dump, debug_zval_dump, print_r)普通、phpで開発する時にvar_dumpをよく使いますが、var_dumpやエラーが発生する時などのメッセージをもっと正確に分析してくれるライブラリのxdebugがあります。これからxdebugのライブラリをインストールしましょう。まず、phpinfoの関数でphpの環境設定に関して確認しましょう。上のphp環境設定のページをソースビューにしてソース全てをセレクトせいてコピーしましょう。(ctrl + c)その後、下記のurlに接続してパッケージ検査をしましょう。ダウンロードパッケージ検査 : https://xdebug.org/wizard.phpその後でパッケージ情報が表示されますが、ダウンロードurlでxdebugライブラリがリンクされ、それを選択してダウンロードしましょう。(筆者の考えはphp環境設定情報でphpバージョンとタイプ(thread safeかthread unsafeか)を正確に分析するようにソースビューのデータをコピーペしたと思います。)ダウンロードしたファイルをphpフォルダのextフォルダにコピーしましょう。そしてphp.iniファイルを修正しましょう。上のダウンロードしたページの3番をみればiniファイルの一番下に入れてください」と書いているのでコピーペすればよいです。そしてサーバを再起動してxdebugセッションがあることを確認できます。xdebugがphp開発でどのように使うか確認しましょう。上の例では$obj変数にtestクラスを宣言してbodyの領域でprint関数を呼出しています。print関数ではtestクラスのdata変数の値を返却していますが、dataの変数は宣言してないです。エラーになるソースですね。xdebugを設定する前には下記のイメージみたいに出力します。それがxdebugを設定する後は下記のイメージみたいに出力します。call stack表示でどこでエラーが発生したかを追跡ができます。前よりもっと詳しい情報が出るので開発する時に楽になると思います。実は初めxdebugを設定する理由はeclipseでデバック機能を付いて使おうと思いましたがeclipse側

Study / PHP

#php,#xDebug

作成日付 : 2020/01/18 03:00:00       修正日付 : 2020/01/18 03:00:00

23

こんにちは。明月です。phpのはウェブスクリプト言語です。ウェブサービスを立ち上がってウェブブラウザと連携すれば様々な情報をブラウザから受け取ります。例えば、ウェブサービスの環境情報やブラウザからのrequest情報、セッション、クッキーなどの情報がありますね。それをphpは「$_server, $globals, $_get, $_post, $_request, $_cookie, $_session, $_files, $_env(getenv())」の変数でサーバとクライアント間で発生した情報を取得するのができます。上の変数を理解するようにはウェブ環境の理解が少し必要です。ウェブとは簡単に考えるとウェブサーバとブラウザ間で非同期通信するプログラムです。ブラウザからurlのアドレスでウェブページをサーバに要請(request)するとサーバの場合はその要請によってhtmlファイルを作成してブラウザに応答(response)します。すごくシンプルな形式でその以外のファイルはファイルサーバみたいにイメージやjavascriptファイル(.js)、style sheetファイル(.css)をダウンロードして、ブラウザで動作するし(javascript)、デザインを描画(styel sheet)、イメージを表示するなどの動作します。ブラウザからウェブサーバに要請するタイプは2つがあります。それはget方式とpost方式があります。getの場合はブラウザのurlの中でクエスチョンマークの区切りでデータをurlに付けサーバに要請するタイプです。postの場合はデータをプロトコールのヘッダに含めて要請するタイプですね。各サーバとブラウザにはプログラム実行中でデータを格納して使っていますが、ブラウザ側でデータを持っていることをクッキー(cookie)というし、サーバ側にデータを持っているのはセッション(session)といいます。しかしブラウザ単位でどのセッションを使うかの設定はブラウザ側のクッキーの格納して要請するたびにセッションキーでサーバ側のセッションを持って来て使う流れで運用しています。すごくシンプルに説明しましたが、詳細のは下記のところで確認してください。link - https://developer.mozilla.org/ja/docs/web/http/overview$_serverlink -

Study / PHP

#php,#$_SERVER,#$GLOBALS,#$_GET,#$_POST,#$_REQUEST,#$_COOKIE,#$_SESSION,#$_FILES,#$_ENV

作成日付 : 2020/01/17 03:00:00       修正日付 : 2020/01/17 03:00:00

24

こんにちは。明月です。プログラムを開発する時にデータの流れを確認しなければならない時があります。その流れのポイントを取って確認する作業をデバッグと言います。簡単なウェブページを作成することならデバッグなしでも値の流れを確認できて、作業ができるかもしれませんが、データベースからデータを検索して取得する流れだと思えば、データの中間でデータが上手く入れ込むか、上手く取得するかを確認することや、もし予想以外のデータがあり、途中で何が間違っているかの確認が必要な時がありますね。javaやc#の場合はいい開発ツール(ide)があり、breakpointでデータ追跡が可能ですが、phpの場合はスクリプト言語なので、デバックができるいい開発ツールがないと思います。先にグーグルで検索してみたらzendstudioがありますね。まだ使ったことがないのでどうかなよく知りません。link - https://www.zend.com/en/downloads今はphpのideツールではjavaでも使うideツールのeclipseを使っていますが、これがphpのデバックができないです。正確に言うとできないことではないですが、筆者の場合は使ったことがないです。link - https://xdebug.org/link - https://wiki.eclipse.org/debugging_using_xdebuglink - https://yard.tistory.com/entry/eclipse-php-debug-私もデバックができるように設定してみましたが、結局失敗しました。stack-overflowの説明とおりだと、eclipse自体にバッグがありそうですね。もし、できる方がいらっしゃいなら教えてください。後でzendstudioで挑戦してみなければならないですね。(zendstudioが無料ではなく、有料です。)筆者の場合は今までphpを開発する時に別にデバックをしながら開発したことではないです。今はeclipseが慣れているから使いますが、10年前はただnotepad++で開発しました。phpはスクリプトなので、ソース修正が簡単だし、すぐ確認できるので「var_dump」の関数を利用して確認ができます。一応、文字がすごく小さく表示されますが、index.phpの8行目、intタイプの値が101ということで表示さ

Study / PHP

#php,#var_dump

作成日付 : 2020/01/16 03:00:00       修正日付 : 2020/01/16 03:00:00

25

こんにちは。明月です。プログラミングで例外処理は重要です。例外処理はプログラムロジックで開発者が考えられなかったこと、ユーザから可笑しいデータを受け取ったものを処理する文法です。link - [c# スタディ - 23] 例外処理(try〜catch,throwそしてfinally)link - [java スタディ - 19] 例外処理( try ~ catch)特に「php」で他の言語と差別性があることではないです。link - https://www.php.net/manual/en/language.exceptions.php上の例をみれば、example関数は呼び出せたらthrowでexceptionが発生します。メインロジックで「try ~ catch ~ finally」の構文でtryの領域でexample関数を呼出します。example関数ではexceptionで例外が発生して、catch領域に移動し、$errormessageの変数にエラーメッセージのデータを入れます。最終的に「try ~ catch」構文の関係なずに、finallyの領域に移動しますが、$checkデータを「1」を加算しますね。結果をみるとエラーメッセージと$checkの値が「1」になることを確認できます。ここで確認ポイントはtry領域でexample()関数を呼出した後checkの変数が加算するところがありますが、example関数でエラーが発生しましたので、checkの加算は実施してないです。基本的にthrowを発生すると処理インタラプトの「try ~ catch」に移動しますが、exceptionを継承してcatchを種類別で処理することもできます。example関数に「1」という値をいれて「myexception1」を発生する。catchでは「myexception1」、「myexception2」、「exception」の例外を設定してエラー別で処理領域を分離しました。結果をみれば「101」になりましたので、「myexcepion1」が呼び出せ、finallyの領域に移動したことを確認できますね。参考で文字上の例で「myexception1」が設定してない場合は「exception」のエラーが発生されます。「exception」の領域が一番上に設定すると区分なしですべてのエラーがexceptionに通るの

Study / PHP

#php,#try,#catch,#finallly

作成日付 : 2020/01/15 03:00:00       修正日付 : 2020/01/15 03:00:00

26

こんにちは。明月です。javaやc#で配列とリスト(list)は別の文法です。array(配列)の場合はその個数を決めてデータを入れるし、配列の個数を減らしたり増えたりするのが出来ないです。list(リスト)の場合は連結リストアルゴリズムでなっている構造でポインタを連携しながら追加したり削除したりする資料構造になっています。phpではその配列とリストの区分が別に分けていることではなく、arraryで宣言してリストみたいに追加や削除ができる構造になっています。そしてphpには連関配列ということでマップやディクショナリみたいに使う配列があります。連関配列は上の配列でインデックスの数代わりに文字を入れると連関配列になります。ここまで配列(リスト)の定義を確認しました。それでデータを追加や削除に関して確認しましょう。関数としてはarray_pushとarray_pop関数があります。array_pushは配列のデータを続けて入れることです。つまり、上の例で[3]までデータを入れたら[4]にデータを入れることですね。array_popは最後のデータ[4]までデータを入れたら[4]データをリターンして削除する関数です。link - https://www.php.net/manual/en/function.array-push.phplink - https://www.php.net/manual/en/function.array-pop.phparray_popの場合は最後でデータを取り除きますが、最初のデータを取り除き関数(array_shift)もあります。link - https://www.php.net/manual/en/function.array-shift.php今回は配列の中でデータを入れる関数(array_splice)です。array_spliceは一つのデータを入れることより、2つの配列を合わせることと同じです。link - https://www.php.net/manual/en/function.array-splice.phpその後、sort関数、extract関数、array_walk関数がありますが、sortの場合は整列、extractは抽出ですが、あまり使わないですね。sortの場合はリストの数字の対象なので、クラスやオブジェクトタイプならsort関数を作らなければなら

Study / PHP

#php,#array,#list

作成日付 : 2020/01/14 03:00:00       修正日付 : 2020/01/14 03:00:00

27

こんにちは。明月です。前述でphpのclassを宣言して使う方法に関して説明しました。link - [php] functionとclass使用方法、アクセス修飾子、そしてstaticphpもクラスがあるのでインタフェース(interface)と抽象クラス(abstract class)があります。個人的な考えはphpにはデータタイプの指示子がないのでインタフェース役がコンパイル言語(javaやc#)より活用性が少ないではないかと思います。筆者も実際にphpでinterfaceを使ったことがないですね。でも抽象クラスはよく使います。上の例をみればitestインタフェースとabstract抽象クラスとtestクラスがあります。依存層は「itest -> abstracttest -> test」でなっています。それでtestを宣言してrunを実行すればabstracttestのrunメソッドが実行してrunメソッド中では派生クラスの「print()」関数を呼び出す結果は「helloworld」になります。ここでparentとthisの概念ですね。$thisの場合は実行しているクラスのメンバーをさしています。すなわち、メンバー変数か関数を指しています。$thisの場合はc++のポインタの形で矢印で指示(->)をしています。しかしparentの場合はparent::の形で指しています。&parent->の形ではエラーが発生します。文法が面白いですね。上の例はobj->runを通ってabstracttestのrunが呼び出してrun関数で抽象メソッドprintが呼び出します。抽象メソッドprintが呼び出したのでtestクラスのprintが呼び出してprint関数で上位クラスのsetdataにデータを入れてgetdataでデータを持ってきて変換する形です。私がデータを「hello world」を入れたので結果は「hello world」が出ます。

Study / PHP

#php,#interface,#abstract,#parent,#this

作成日付 : 2020/01/13 03:00:00       修正日付 : 2020/01/13 03:00:00

28

こんにちは。明月です。phpは基本的にスクリプト言語なので、javascriptみたいに「function」と「class」を宣言しなくてもphpページを作ることができます。でも、最近ウェブプログラムはデータベースからデータを読み込んでそのままにウェブサービスに書き出すことではなく、複雑な計算と様々なデータを総合的に見せるポータルプログラム形式が多いのでかなり複雑に作成することになります。その時に単純にデータベースあるいはファイルなどからデータを読み込んで計算しながらウェブページに掲示すればプログラムがかなり複雑になるし再使用性がたくさん落ちることになります。それでfunction(関数)やclass形式な構造が必要です。先、functionの構造は「java」と「c#」みたいに返却タイプがあることではなく、「javascript」みたいにないですね。初めからphpは変数宣言する時もデータタイプを宣言することではないからだと思いますね。「javascript」と似てるな構造になります。phpでクラスの構造は一般oopプログラムと似てます。メンバー変数があるし、関数がある構造になります。ここでメンバー変数で「private」というアクセス修飾子を使いました。クラス内部の関数の場合はアクセス修飾子が必須ではないですが、メンバー変数には必ずアクセス修飾子が必要です。アクセス修飾子は「private」、「protected」、「public」があります。「private」の場合はインスタント外部でアクセス禁止、「protected」の場合はインスタントの内部、派生クラスの関数だけでアクセスができます。「public」の場合はインスタントの外部、内部でとこでもアクセスができます。 区分 アクセス修飾子 説明 アクセス権限 public すべてクラスでアクセスが可能です。 private クラス内だけアクセスが可能です。 protected クラスと派生クラス関係のクラスによってアクセスが可能です。 link - [java スタディ - 11] アクセス修飾子link - [c# スタディ - 13] アクセス修飾子(p

Study / PHP

#php,#function,#class,#static

作成日付 : 2020/01/09 23:35:27       修正日付 : 2020/01/09 23:32:40

29

こんにちは。明月です。phpをインストールしてideを構成しました。後、composerまでインストールまで完了しました。そのことでphpの基本的な開発準備は終わりました。link - [php] php 開発環境設定とeclipse(ide)の設定link - [php] composer設定phpはjavaとc#と比べてコンパイル言語ではなく、スクリプト言語です。スクリプト言語はコンパイル、すなわち機械語の変換がなしでスクリプト自体を解読して運用する言語といいます。スクリプト言語とは代表的にjavascriptとpythonなどがあります。phpファイルの構成形は下記となります。php処理領域は<?phpで始まって?>で終了します。値を出力する時は<?=変数 ?>形で出力が可能です。もちろん、出力を<?=変数 ?>ではなく、<?php echo 変数 ?>でも可能です。その以外の領域はそのままhtmlで出力になると思えばなります。phpは別途のデータタイプをもってないです。それで変数宣言も必要ないです。単純に$変数名で宣言が可能です。でもデータタイプ宣言をしないって言っても変数タイプがないことではないです。例えば、文字列タイプで定数タイプを加算すればエラーが発生します。エラーではなく、warningが発生します。定数や実数などで数と関係がある処理式は既存とみたいに「+,-,*,/」で使用が可能です。そして文字列はデータを合わせる時に「+」ではなく、「.」を使用して文字列を合わせます。その後、制御文、繰返し文と使用可能です。これは他の言語と似てるので「java」や「c#」を参考してください。link - [java スタディ - 5] 制御文 - 分岐 (if, switch〜case)link - [c# スタディ - 9] 制御文 - 分岐 (if, switch〜case, goto)

Study / PHP

#php,#variable

作成日付 : 2020/01/06 23:44:20       修正日付 : 2020/01/06 23:20:36

30

こんにちは。明月です。phpのcomposerとはjavaのmaven、c#のnugetと同じ機能で、パッケージ間の依存性を管理するし、ライブラリをダウンロード及びリンクを管理するモジュールです。先、composerをインストールするように「php.ini」を設定しなければならないです。以前にインストールした「php」フォルダに移動しましょう。link - [php] php 開発環境設定とeclipse(ide)の設定上の設定ファイルの中でextension=opensslのモジュールがありますがセミコロン(;)でコメント処理になっております。このセミコロンを削除しましょう。そしてコマンドで「php」がインストールされたフォルダに移動しましょう。(※参考に私の場合は今プロクシ設定している環境で使っているので「-x -u」オプションでプロクシ設定しましたが、この部分は省略してもよいです。)インストールが完了しました。というメッセージが表示されました。その後、composerバッチファイルを作成しましょう。そしてコマンドで「composer」ということで入れたら、下記とおりの画面がでます。ここまでcomposerがインストールが終わって設定が完了しました。link - https://packagist.org/javaのmavenレポジトリより少し整理されてない雰囲気ですが、必要な情報はあるのでかなり便利です。検索テキストで「carbon」ということで入れて検索しましょう。参考に「carbon」はデートフォーマット関連ライブラリです。そうしたらよく使う順番で検索されますが、一番上の結果を選択しましょう。様々な説明がありますが、時間があれば詳しくみるのはよいですね。でも、我々はライブラリリンクするのが目的なので、下の「installation」の項目をみましょう。リンク情報を得たのでドキュメントルートのフォルダに移動しましょう。ここで「composer.json」ファイルを生成しましょう。そしてリンク情報を入力しましょう。composerを実行すればよいですが、筆者の場合はcomposerバッチがあるところをシステムパス設定をしなかったので、直接に絶対パスで実行しました。ライブラリがタウンロードさせてリンクが完了しました。これからダウンロードしたライブラリを使ってみましょう。eclipseを起動してproj

Study / PHP

#php,#composer

作成日付 : 2019/12/27 08:49:09       修正日付 : 2019/12/27 08:52:22

31

こんにちは。明月です。ネットサーフィンすれば、「java vs c#」、「php vs java」、「php vs c#」など、言語の優秀性、性能、短所などを比較して書いた投稿が多いです。筆者の場合はプログラム言語を3~4個の言語を運用が可能ですが、言語の間に比較するのは意味がないと思います。例えば、リンゴとミカンがあります。リンゴが栄養が多いか?ミカンが栄養が多いか?健康にいいものか?どの果物がもっといいかというとみんなリンゴはリンゴの味で美味しいし必要な栄養があるし、ミカンはミカンで美味しいし栄養がありますといいますね。プログラム言語も同じです。これから紹介するphpはウェブスクリプトですが、javaとc#の比べてphpだけの魅力があるプログラム言語です。それで意味がない比較を少ししてphpの特性を説明します。phpとjavaを比べるとphpはjavaより基本環境設定が簡単です。「php+apache+db」の設定で終わります。javaの場合は「apache+tomcat+java+db」です。そういえば、「tomcat」だけ追加されたですね。phpの場合はコンパイル言語ではなく、スクリプト言語なので、ソース修正する時に、別途のコンパイルの手続きが要らなく、画面ページに反映が早いですが、javaの場合は再コンパイル、サーバ再起動などの手続きが必要なので修正から反映までphpの開発時間が圧倒的に早いです。プログラムのパフォーマンスはプログラム言語の性能もありますが、開発する人(デベロッパー)の能力の比重が多いので、省略します。まだ、プロぐジェクト管理能力に関してもphpが大きいプロジェクトには悪く、javaが大きいプロジェクトでよいといいますが、これも設計、環境設定なのによって差があるので、どっちがいいかとは言えません。オープンソースはコミュニティに関してはjavaの方が大きいではないかと思います。でもphpコミュニティも小さくなく、すごく大きいです。筆者はメイン言語がphpよりjavaなので筆者の感じだけの可能性もあります。上の状況だけみればphpがjavaよりいい言語みたいに見えます。phpの場合はスレッド処理が難しいです。例えば、phpではゲームサーバーを作られないです。正確には出来ないことではなく、難しいというのが正確だと思います。javaの場合はthreadpoolを利用してソケットサーバーを

Study / PHP

#php,#install

作成日付 : 2019/12/26 07:36:47       修正日付 : 2019/12/26 07:36:47