SSブログ

PHPの本家で言語仕様を知らないところだけつまみ食い。 [プログラミング]

あ〜書いた記事、間違えてサクッと消してもうた〜w。


PHPですが、本家ドキュメントは読まないといけないとは思っていたのだが、本家サイトはググって関数リファレンスぐらいしか見ていなかった。

https://www.php.net/manual/ja/langref.php

今まではざっくり言語体系を見てきたが、厳密なところはやっぱり本家で勉強しなきゃだろ、というところですね。幸か不幸か日本語訳にもされているので、お気軽に純日本人でも読めます。



やっぱり本家はきちんとした知識を一次情報として与えてくれる。
https://www.php.net/manual/ja/language.basic-syntax.phptags.php


PHPタグは終了タグを省略できる。

ファイルが PHP コードのみを含む場合は、ファイルの最後の終了タグは省略するのがおすすめです。 終了タグの後に余分な空白や改行があると、予期せぬ挙動を引き起こす場合があるからです。

なんか気持ち悪いけど、お作法としてそっちの方がいいってこことね。知らない人が見たら、勝手に終了タグをつけられちゃいそうで逆に面倒かもしれない。

ふつうは

<?php
処理とか
?>

とするけれども、PHPコードだけとかの場合、?>を入れると
空白や改行が入っていると意図せず出力されてしまうらしい。

だけどさ、ネストして終わらないとなんだか気持ち悪いよね。
PHPコードだけじゃない場合も、終了タグを省略したほうがいいらしい。



https://www.php.net/manual/ja/language.basic-syntax.phpmode.php
ここも新しい発見がありました。さすが本家、細いところを突いてきます。

<?php if ($expression == true): ?>
  条件式が真の場合にこれが表示されます。
<?php else: ?>
  それ以外の場合にこちらが表示されます。
<?php endif; ?>


phpのコードって分割しても続くんだね〜。長い文を出したり消したりするときには、このような方法を使う方がスッキリしていいのかもしれない。



https://www.php.net/manual/ja/language.basic-syntax.instruction-separation.php
PHP コードブロックの終了タグには自動的にセミコロンが含まれていると認識されます。 従って PHP コードの最終行にはセミコロンを記述する必要はありません。

これも知らない人が見たら気持ち悪がるかもしれません。なんというか、こういうお作法がPHPを嫌う人を増やしている気がする。



/* */ のコメントはC言語と同じようにネストしたらあかんよという話も気にしておこう。わりとC言語の知識が通用するのがおじさんとしては嬉しいw。/* */のコメントはC言語と同じように多重にネストしちゃダメ。そこいらは同じアルゴリズムというか、手抜き実装をしているんだろう。Golangだとかだと多重にネスとしても有効だった気がする。やっぱりそういうところは後から出たほうが出来がいいのは確かである。




式の型と値を正確に知りたい場合は、 var_dump() 関数を使用。
型とかよりもprint_r()と同類かと思っていたんだけど。
型もわかるようになるけど、print_rの方が簡潔でデバッグ向きかな。


https://www.php.net/manual/ja/language.types.php

booleanは空の文字列""と、空の配列array()はfalseになるのは知っておいた方がいいかな。
あといろいろFALSEになるケースがあるみたいだけどいいや。


二進数は0b始まりの数字で書けるけど、基本的に0xの16進数が書ければ問題ないかな。
どうせPHPでビット演算みたいなことをすることは少ないだろうし。

PHP7以前のバージョンは64bitマシンでも32bitの整数なんだな。
まぁ昔のソースを使わなきゃ関係ないし、そこまででかい数値は扱わないかも。
でも会計で20億を超えることって普通にあるか。そんなシステムにPHPは使わないだろうが。

キャストは気にしないことにする。オーバーフローも気にしないw。

浮動小数点数は精度を気にして使うもんじゃなさそうだな。NaNには気を付けたほうがよさそう。





なんかイヤーなことが書いてある文字列型。
https://www.php.net/manual/ja/language.types.string.php

これは、PHP が Unicode をネイティブにサポートしていないことも意味します。


上のドキュメントの最後の方につらつらと書かれているのですが、何か面倒くさい感じです。



あと他のところでは制限なしと書かれていた文字列の長さですが制限がありました。
「文字列の最大長は 2GB (2147483647 バイト) です」
まぁ制限あるよな、普通はw。
というか、そこまででかいデータは文字列として扱わないのが普通だろうと。


ヒアドキュメントでも文字列展開はできると。基本""で囲まれたものと同じく
扱われるっぽい。<<<後のIDで終端のIDはインデントしてはいけないらしい。
終わりだと思われず、ずっとパースし続けるからバグの素になる可能性がある。


NowDocってのは知らなかったな。ヒアドキュメントのシングルクォート版。
https://www.php.net/manual/ja/language.types.string.php#language.types.string.syntax.nowdoc
当然埋め込みとかはできない。
閉じるときの''は要らないみたい。


波かっこの埋め込みは${hoge}と{$hoge}ができるけど、どっちかに統一したほうが見やすいは見やすいな。
わりと波括弧の中は複雑なものも入れられるらしいので、何でもできそうだがシンプルなのが吉。


文字列操作の関数に関しては、かなりあるので使うときに確認できればいい。
https://www.php.net/manual/ja/ref.strings.php

Perl互換の高度な検索置換関数はこっち。
https://www.php.net/manual/ja/ref.pcre.php
高度っていうとあれだけど、正規表現系だよね。正規表現自体が高度というか。

URL関連はbase64_encode、base64_decodeあたりでメールの操作とかにも使えそうだね。
https://www.php.net/manual/ja/ref.url.php



キャスト関係は大事なんだけども、これはクラスの話になったときに回した方が良さそうな。
PHPは変な文字列から数値への変換があるので、それは気にしないといけないって話はあった。
https://www.php.net/manual/ja/language.types.string.php#language.types.string.conversion

先にも変な仕様だなとPHPを色眼鏡で見ていたが、まぁそういう仕様なんだから仕方がない。






配列は、連想配列を兼ねているくらいかなぁ、と思ったらそうでもなかった。

PHP の配列は、実際には順番付けられたマップです。マップは型の一種で、 値をキーに関連付けます。 この型は、さまざまな使い道にあわせて最適化されます。 配列としてだけでなく、リスト (ベクター)、 ハッシュテーブル (マップの実装の一つ)、辞書、コレクション、スタック、 キュー等として使用することが可能です。 PHP の配列には他の PHP 配列を値として保持することができるため、 非常に簡単にツリー構造を表現することが可能です。


https://www.php.net/manual/ja/language.types.array.php

添え字がキャストされて変なバグが起こりそうな仕様。

unset()で配列の要素を削ることができた。まぁポンポン入れられるので消すのもできないとね。

配列に関する関数もかなりある。これも必要な時に探せばいい。ただ何があるかはわかっておいた方が良さそうだ。
https://www.php.net/manual/ja/ref.array.php
これも配列がいろいろなことに使えるため、いろいろな機能が一緒くたになっている感じではある。






いてらぶる? イテレーターの仕組みが使えるってことなのかな?
https://www.php.net/manual/ja/language.types.iterable.php
インターフェイスみたいなものやろか?
そもそもPHPにinterfaceがあるのやろか?
あった。PHPのインターフェイスはタイプヒンティングと組み合わせて使うといいみたいに書いてある。



こういうリファレンスはどこから読んでいいものやら迷うことが多い。行ったり来たり飛んだり戻ったりで、結局何調べてたんだっけってことになりがちだ。まぁそれを含めてのお勉強なのだが、調べ物の仕方のコストが低いやり方がいいよな。とはいえ、一通りのことを調べて、細かいところを本家ドキュメントを見ているのだから、脱線しまくるのは仕方のないことなのかもしれない。

ここいらへんはクラスとかきちんと調べないと見ちゃいけないところのような気がするんだけど、ドキュメントの順序から入ってしまった。

と、次はオブジェクトの型の話だけど、クラス周りの話をしないと話にならないよなぁ。
https://www.php.net/manual/ja/language.types.object.php

順番からするとこっち側から先に読むべきなのかもしれないが、やっぱオブジェクト指向そのものを扱うようなものなので先は長い。
https://www.php.net/manual/ja/language.oop5.php

知らない所だけチョコチョコつまみ食いしようとしたけど、知らないことが多すぎたw。というか、言語的に例外的な部分が多すぎるような気がします、PHP。まぁどの言語もクセはあるんだけど、なかなかにクセが強い。

そんなわけで本家サイトのリファレンスを全体をさらおうとしたけど、細かい気になることが多すぎてすぐにできませんでした。言語体系がシンプルって言ってもこれだからね。やっぱりコンピューターは奥が深い。

タグ:PHP
コメント(0) 
共通テーマ:パソコン・インターネット

Twitterまとめ投稿 2019/12/28 [Twitter]


コメント(0)