PHP勉強(クラスから正規表現まで) [プログラミング]
ここから勉強再開。
https://www.scollabo.com/banban/php/php_11.html
オブジェクト指向を使えるらしいが、PHPなのに生意気だぞっw。
こんなかんじで、定義できて
でインスタンスが生成できる。まぁ普通のオブジェクト指向だ。アクセス制御はできないのかな。できんくても、できない言語はそこそこあるし。
で取り出せる。getterやsetterを作ってもいいんだろうけど、そこまでする必要があるのかどうか。アクセス制御がないくらいだから、継承とかの話もないんだろうな。そこいらの話もいずれ本家サイトに行って確かめに行ってみようと思う。
PHPで扱える暦には色々あるらしいけど、結局はUTCでしょって話で。
getdate( )関数で、返される連想配列はちょっと面白いな。
ん?[second]は[seconds]で[mimutes]は[minutes]じゃないと出てこないよな。
まぁこの程度のタイポはするか。
大体、getdate( )でいけると思うけど、細かいことを気にするとdate( )も必要かもね。
ゼロで埋めたり埋めなかったりの制御もdate( )だと考慮されているし。
ただどちらも時差は気にしていないので、内部的に処理するならいいにしろ、表示するんだったら時間に9を足すんだか引くんだかしないといけないはずだ。
https://www.sejuku.net/blog/21351
php.iniを変えても9時間の訂正がされないので、
でやるしかないのかな?
実際の運用的にDBの中に入れる時とかどうするんだろ。DBの中身はUTCのままで、表示の時いちいち変換かけるのかな? 一般的なお作法としてどうなんだろう。php.iniでローカル時間に固定されれば何の問題もなくなる気はするんだが、こういう環境による差異は厳しいよな。
画像処理できると書いてあったけど、ソースのままだと画像が壊れてますと出てしまったので、どうせあんまり使い道ねーなと思い、とりあえず放置にします。GDってのが入ってないのかな?
おっ!次はセッションだ。なかなかWebアプリらしくなってきたじゃないの。まぁDBを扱う前にセッションだわな。
で使えるらしいんだけども、細かいサンプルとかはないのですね。厳しいな。どこかで探さないとな。よく考えたらユーザー認証と絡めて使うのが普通だから、それ以前にDBは使うのですよね。なんか順序がよくわかんなくなってたわ。
https://www.sejuku.net/blog/25276
セッション管理をDBで行うってのもあるし、やはりDBの扱いを先にやっておきたいところ。でも、下記のリンクで同じサイトを続けます。
https://www.scollabo.com/banban/php/php_15.html
正規表現を使えるのね。まぁこれも普通のプログラミング言語っぽいね。これも使い方が具体的にわからないのだが、使うときに何かで囲わなくていいのかね。
https://eng-entrance.com/php-regularex
//で囲う必要があるっぽい。Rubyとかもそうだっけかな。
と先に行こうとしたら、このサイトは終わってしまいました。入門だからこんなもんなのかな。基本的な文法はわかったけど、取りこぼしがありそうなので別のサイトでも見てみることにする。
一通り見てみた感じでは、最近のLLよりかはC言語っぽいなというのが感想。ビギナーでも取り組みやすい言語とされているけれども、書き方が色々できるのでC言語っぽい癖が出てきてしまうところは仕方ないところなのだろう。
別のサイトで情報を追加しておきましょうね。
https://www.javadrive.jp/php/
コメントは // だけじゃなく、#でもいいし、/* */で囲ってもいい。
/* */ はともかく、// と # が同じ機能で二通りあるような、こういう画一性のなさがよくないんだろうな。同じソースにどっちもあったとしたら、ちょっと気持ち悪くはある。
/* */を使うんだったら、他の言語と同じように//で統一したいところではある。
にしても複数行をコメントアウトできるのがわかってちょっと安心。
文字列の埋め込みもできたけど、前のところに書いてなかった気がする。
でもこれでは後ろにスペースを入れないといけないので ${name} とやった方がいいらしい。
埋め込む文字列はダブルクォートでくくらないと、シングルではそのまま文字列として出てしまうようだ。エスケープシーケンスでもシングルだとそのまま出てくるようだ。
この機能はないといちいち文字列連結で対応しないといけないので、やっぱあった方がいい。
x進数の表示は
10進数→123
8進数→0123
16進数→0x123
というかんじですが、多分C言語と同じだったかと思います。まぁ8進数はほとんど使わないよね。知ってはいるけど使ったことがないです。32bitの大きさの範囲って書いてあるけど、今は64bitのマシンが主流なので64bitの範囲になっているかもね。整数はそうだけど浮動小数点もそうなんだろう、たぶん。
演算子の優先順位はありますが、いちいち覚えているのも面倒なので、気になるときは( )で優先させましょう。PHPはいい加減みたいなことを言われますが、こういうところはきっちりしてますね、当然。
型変換はわかりますが、「整数+浮動小数点=浮動小数点」みたいなのは普通です。前に言ったように"123hogehoge"は123という数値に型変換されるという気持ち悪い性質があります。そういう性質があるのは前にわかったけど、それが型変換の範囲内で行われているという事は知りませんでした。
先頭の文字が数値でない場合は0として扱われます、だそうです。足し算引き算なら影響ないけど、掛け算だとゼロになっちゃうし、0で割り算したら例外出ちゃわないかなぁ。ちなみにPHPでも例外があるようです。
https://www.php.net/manual/ja/language.exceptions.php
自分で例外投げているから、意図的にやらないと0除算では例外が出ないんだね。ふーん。
というか、次は本家サイトで最終的な文法のチェックをしようかな。
PHPでは変数は初期化していなくてもNULLが入って実行されてしまうので、エラーとかにはならないからバグの元ですね、というのは前にも書いてありました。NULLが指定されるところまでは知らんかったけど。
変数を再利用して、型が違うものを入れても変数の型は変わる。それは実際に試していたから経験的に知っていた。そういうのはやっぱりやってみないと実感できないところはある。やっぱり環境を用意してやる意味は十分にあるよな、めんどうだけど。ちなみにgettype( )で型の種類はわかる。
基本的にPHPは、代入をするときは値渡しで、あえて参照渡しをするときは =& で代入する。
とするとどっちも同期されたような状態になる。ポインタ的な使い方だけど、使い方としては一般的な参照だよな。まぁそっちの方がいいけど。先にも述べたように関数への参照渡しと何の代わりもない。
比較演算子で未見のものは以下でした。
=== bとaの値が等しく型も等しい
!== bとaの値または型が等しくない
JavaScriptとかでもあったし、ちょっと違う動作でRubyでもあった。JavaScriptと同じものとみていいのかな? 使った方がいい演算子だけどあまり見ないというパターンかも。
三項演算子もC言語と同じものがあるようだが、可読性が下がるのであまり使わんとこう。使っているところがあったら読めるぐらいにしておくことにしましょうね。三項演算子はあまり評判が良くないから、C言語以外はあまり使わないことが多かったりする。演算子オーバーロードでも実現しにくそうだ。
break文に数を指定すると、抜け出す階層の数を指定できる。
二重にネストされたwhile文を一気に抜ける場合には
とすればいいらしい。ソース的にわかりやすくはないが便利な機能ではある。
continue文もあったけど、前のところには書いてなかった。これも
とすれば、2階層戻れるそうだけど、これはわかりにくそうな気がする。
配列の要素を変えたい時は、参照型に変えてあげればいいらしい。こういうのは参照が優れているとは思うよね。
foreachが終わったときには、配列をunset( )で参照解除してあげるといいらしい。面倒くさくてやらなさそうだなぁ。関数を作るときにはいらない心配を作らないためにはやるべきだろうとは思うけど。
配列を見るときには、print_r( )で見るとしんどくない。
printfデバッグ的な手法が横行しそうな感じ。
他にも組み込みの便利な関数があるのだろうけど、一度全部一覧で見ておいた方がよさそうである。
https://www.scollabo.com/banban/php/reference.html
でもこういうのは本家を見ておいた方がよさそうだなぁ。まぁおいおいってことで。
配列で
は
と同じに扱われるそうだ。連想配列じゃないらしい。でも
は08という文字列のキーの連想配列になるんだって。こういうバグが出そうな仕様はどうにかならんか。
連想配列のキーは変数をそのまま入れてもいいし、文字列に変数を展開させたものでもいいらしい。なんかこういう仕様は書きやすくても、ソースの可読率が下がりそうで嫌だ。
で自動的に採番して配列に入れてくれるけど、それまでにいきなり$var[100]とか最大の添え字のものがあったら、1〜99の番号の配列がなくてもすっ飛ばして101番から続けて採番される。
多次元配列も使えるみたいだけど、個人的な感想として、C言語より配列に配列を入れる感覚が強い。
関数は特に問題ないとして、クラスですね。
前にアクセス制御がなさそうだと書いたのですが、ガッツリありました。
public private protected
ってあって役割はC++と一緒みたいですね。メンバ変数にもメソッドにも使えます。
こんなかんじで普通にカプセル化はできるみたいです。
クラス内でメンバ関数にアクセスするときはthisでポイントするようです。Rubyとかやっているとselfとか思いついてしまうのだけれど、基本C/C++系の流れを汲んでるぽいのでthisでやります。
メソッドを使うときにはオブジェクト指向としては普通ドットを使うんだけど、PHPは -> を使うので気にしないと忘れそう。ドットは基本的に文字列をつなぐときに使ったりするんで、そこは違うものとして覚えないといけない。
気持ち悪いのがクラス内の定数ですね。クラスじゃない定数と違って、宣言も使うときも違います。
宣言するときはconstで宣言して、使うときは「self::定数名」で使うようで、クラスの考え自体が後から取ってつけたのであろう印象を受けます。
クラスがnewされるときに実行されるコンストラクタもあり、
で宣言できます。必ず実行されるので初期化忘れはなくていいですね。
継承関係はないのかな? 前もアクセス制御がないと思っていたので調べるとあったとかありそうですが、それもあとで本家ドキュメントで確かめましょうか。
基本的に文法部分を見てきましたが、大体は見ることができたと思います。これ以上は本家を見た方が良さそうな気がしますね。というわけで、初級は卒業したとします。
https://www.javadrive.jp/php/
このページでは後に続きますが、あとはこの文法を使って、認証だとかセッションだとかDBだとかの扱いをしていきたいと思っています。この後は明らかに文法というより実際のアプリの使い方となるPHPの使い方になってきているので別に勉強していきたいと思います。
https://www.scollabo.com/banban/php/php_11.html
オブジェクト指向を使えるらしいが、PHPなのに生意気だぞっw。
class クラス名 { var $メンバ変数 = "hogehoge"; function メソッド名() { } }
こんなかんじで、定義できて
$変数 = new クラス名();
でインスタンスが生成できる。まぁ普通のオブジェクト指向だ。アクセス制御はできないのかな。できんくても、できない言語はそこそこあるし。
$変数 -> メンバ変数
で取り出せる。getterやsetterを作ってもいいんだろうけど、そこまでする必要があるのかどうか。アクセス制御がないくらいだから、継承とかの話もないんだろうな。そこいらの話もいずれ本家サイトに行って確かめに行ってみようと思う。
PHPで扱える暦には色々あるらしいけど、結局はUTCでしょって話で。
getdate( )関数で、返される連想配列はちょっと面白いな。
ん?[second]は[seconds]で[mimutes]は[minutes]じゃないと出てこないよな。
まぁこの程度のタイポはするか。
大体、getdate( )でいけると思うけど、細かいことを気にするとdate( )も必要かもね。
ゼロで埋めたり埋めなかったりの制御もdate( )だと考慮されているし。
ただどちらも時差は気にしていないので、内部的に処理するならいいにしろ、表示するんだったら時間に9を足すんだか引くんだかしないといけないはずだ。
https://www.sejuku.net/blog/21351
php.iniを変えても9時間の訂正がされないので、
echo date("Y/m/d H:i:s", strtotime('+9hour'));
でやるしかないのかな?
実際の運用的にDBの中に入れる時とかどうするんだろ。DBの中身はUTCのままで、表示の時いちいち変換かけるのかな? 一般的なお作法としてどうなんだろう。php.iniでローカル時間に固定されれば何の問題もなくなる気はするんだが、こういう環境による差異は厳しいよな。
画像処理できると書いてあったけど、ソースのままだと画像が壊れてますと出てしまったので、どうせあんまり使い道ねーなと思い、とりあえず放置にします。GDってのが入ってないのかな?
おっ!次はセッションだ。なかなかWebアプリらしくなってきたじゃないの。まぁDBを扱う前にセッションだわな。
$_SESSION[セッション変数名] = 値;
で使えるらしいんだけども、細かいサンプルとかはないのですね。厳しいな。どこかで探さないとな。よく考えたらユーザー認証と絡めて使うのが普通だから、それ以前にDBは使うのですよね。なんか順序がよくわかんなくなってたわ。
https://www.sejuku.net/blog/25276
セッション管理をDBで行うってのもあるし、やはりDBの扱いを先にやっておきたいところ。でも、下記のリンクで同じサイトを続けます。
https://www.scollabo.com/banban/php/php_15.html
正規表現を使えるのね。まぁこれも普通のプログラミング言語っぽいね。これも使い方が具体的にわからないのだが、使うときに何かで囲わなくていいのかね。
https://eng-entrance.com/php-regularex
//で囲う必要があるっぽい。Rubyとかもそうだっけかな。
と先に行こうとしたら、このサイトは終わってしまいました。入門だからこんなもんなのかな。基本的な文法はわかったけど、取りこぼしがありそうなので別のサイトでも見てみることにする。
一通り見てみた感じでは、最近のLLよりかはC言語っぽいなというのが感想。ビギナーでも取り組みやすい言語とされているけれども、書き方が色々できるのでC言語っぽい癖が出てきてしまうところは仕方ないところなのだろう。
別のサイトで情報を追加しておきましょうね。
https://www.javadrive.jp/php/
コメントは // だけじゃなく、#でもいいし、/* */で囲ってもいい。
/* */ はともかく、// と # が同じ機能で二通りあるような、こういう画一性のなさがよくないんだろうな。同じソースにどっちもあったとしたら、ちょっと気持ち悪くはある。
/* */を使うんだったら、他の言語と同じように//で統一したいところではある。
にしても複数行をコメントアウトできるのがわかってちょっと安心。
文字列の埋め込みもできたけど、前のところに書いてなかった気がする。
$name = '小鳥遊';
echo "こんにちは。$name さん";
でもこれでは後ろにスペースを入れないといけないので ${name} とやった方がいいらしい。
埋め込む文字列はダブルクォートでくくらないと、シングルではそのまま文字列として出てしまうようだ。エスケープシーケンスでもシングルだとそのまま出てくるようだ。
この機能はないといちいち文字列連結で対応しないといけないので、やっぱあった方がいい。
x進数の表示は
10進数→123
8進数→0123
16進数→0x123
というかんじですが、多分C言語と同じだったかと思います。まぁ8進数はほとんど使わないよね。知ってはいるけど使ったことがないです。32bitの大きさの範囲って書いてあるけど、今は64bitのマシンが主流なので64bitの範囲になっているかもね。整数はそうだけど浮動小数点もそうなんだろう、たぶん。
演算子の優先順位はありますが、いちいち覚えているのも面倒なので、気になるときは( )で優先させましょう。PHPはいい加減みたいなことを言われますが、こういうところはきっちりしてますね、当然。
型変換はわかりますが、「整数+浮動小数点=浮動小数点」みたいなのは普通です。前に言ったように"123hogehoge"は123という数値に型変換されるという気持ち悪い性質があります。そういう性質があるのは前にわかったけど、それが型変換の範囲内で行われているという事は知りませんでした。
先頭の文字が数値でない場合は0として扱われます、だそうです。足し算引き算なら影響ないけど、掛け算だとゼロになっちゃうし、0で割り算したら例外出ちゃわないかなぁ。ちなみにPHPでも例外があるようです。
https://www.php.net/manual/ja/language.exceptions.php
自分で例外投げているから、意図的にやらないと0除算では例外が出ないんだね。ふーん。
というか、次は本家サイトで最終的な文法のチェックをしようかな。
PHPでは変数は初期化していなくてもNULLが入って実行されてしまうので、エラーとかにはならないからバグの元ですね、というのは前にも書いてありました。NULLが指定されるところまでは知らんかったけど。
変数を再利用して、型が違うものを入れても変数の型は変わる。それは実際に試していたから経験的に知っていた。そういうのはやっぱりやってみないと実感できないところはある。やっぱり環境を用意してやる意味は十分にあるよな、めんどうだけど。ちなみにgettype( )で型の種類はわかる。
基本的にPHPは、代入をするときは値渡しで、あえて参照渡しをするときは =& で代入する。
$num2 =& $num1;
とするとどっちも同期されたような状態になる。ポインタ的な使い方だけど、使い方としては一般的な参照だよな。まぁそっちの方がいいけど。先にも述べたように関数への参照渡しと何の代わりもない。
比較演算子で未見のものは以下でした。
=== bとaの値が等しく型も等しい
!== bとaの値または型が等しくない
JavaScriptとかでもあったし、ちょっと違う動作でRubyでもあった。JavaScriptと同じものとみていいのかな? 使った方がいい演算子だけどあまり見ないというパターンかも。
三項演算子もC言語と同じものがあるようだが、可読性が下がるのであまり使わんとこう。使っているところがあったら読めるぐらいにしておくことにしましょうね。三項演算子はあまり評判が良くないから、C言語以外はあまり使わないことが多かったりする。演算子オーバーロードでも実現しにくそうだ。
break文に数を指定すると、抜け出す階層の数を指定できる。
二重にネストされたwhile文を一気に抜ける場合には
break 2;
とすればいいらしい。ソース的にわかりやすくはないが便利な機能ではある。
continue文もあったけど、前のところには書いてなかった。これも
continue 2;
とすれば、2階層戻れるそうだけど、これはわかりにくそうな気がする。
配列の要素を変えたい時は、参照型に変えてあげればいいらしい。こういうのは参照が優れているとは思うよね。
foreach (配列変数 as &変数){ 処理; }
foreachが終わったときには、配列をunset( )で参照解除してあげるといいらしい。面倒くさくてやらなさそうだなぁ。関数を作るときにはいらない心配を作らないためにはやるべきだろうとは思うけど。
配列を見るときには、print_r( )で見るとしんどくない。
print_r($配列変数名);
printfデバッグ的な手法が横行しそうな感じ。
他にも組み込みの便利な関数があるのだろうけど、一度全部一覧で見ておいた方がよさそうである。
https://www.scollabo.com/banban/php/reference.html
でもこういうのは本家を見ておいた方がよさそうだなぁ。まぁおいおいってことで。
配列で
$var['8'] = 75;
は
$var[8] = 75;
と同じに扱われるそうだ。連想配列じゃないらしい。でも
$var['08'] = 75;
は08という文字列のキーの連想配列になるんだって。こういうバグが出そうな仕様はどうにかならんか。
連想配列のキーは変数をそのまま入れてもいいし、文字列に変数を展開させたものでもいいらしい。なんかこういう仕様は書きやすくても、ソースの可読率が下がりそうで嫌だ。
$var[] = "hoge";
で自動的に採番して配列に入れてくれるけど、それまでにいきなり$var[100]とか最大の添え字のものがあったら、1〜99の番号の配列がなくてもすっ飛ばして101番から続けて採番される。
多次元配列も使えるみたいだけど、個人的な感想として、C言語より配列に配列を入れる感覚が強い。
関数は特に問題ないとして、クラスですね。
前にアクセス制御がなさそうだと書いたのですが、ガッツリありました。
public private protected
ってあって役割はC++と一緒みたいですね。メンバ変数にもメソッドにも使えます。
こんなかんじで普通にカプセル化はできるみたいです。
$this->メンバ変数名;
クラス内でメンバ関数にアクセスするときはthisでポイントするようです。Rubyとかやっているとselfとか思いついてしまうのだけれど、基本C/C++系の流れを汲んでるぽいのでthisでやります。
メソッドを使うときにはオブジェクト指向としては普通ドットを使うんだけど、PHPは -> を使うので気にしないと忘れそう。ドットは基本的に文字列をつなぐときに使ったりするんで、そこは違うものとして覚えないといけない。
気持ち悪いのがクラス内の定数ですね。クラスじゃない定数と違って、宣言も使うときも違います。
class クラス名(){ const 定数名 = 値; function メソッド名(){ print(self::定数名); } }
宣言するときはconstで宣言して、使うときは「self::定数名」で使うようで、クラスの考え自体が後から取ってつけたのであろう印象を受けます。
クラスがnewされるときに実行されるコンストラクタもあり、
function __construct(){ }
で宣言できます。必ず実行されるので初期化忘れはなくていいですね。
継承関係はないのかな? 前もアクセス制御がないと思っていたので調べるとあったとかありそうですが、それもあとで本家ドキュメントで確かめましょうか。
基本的に文法部分を見てきましたが、大体は見ることができたと思います。これ以上は本家を見た方が良さそうな気がしますね。というわけで、初級は卒業したとします。
https://www.javadrive.jp/php/
このページでは後に続きますが、あとはこの文法を使って、認証だとかセッションだとかDBだとかの扱いをしていきたいと思っています。この後は明らかに文法というより実際のアプリの使い方となるPHPの使い方になってきているので別に勉強していきたいと思います。
タグ:PHP
コメント 0