はじめに
こんばんわ!
今回担当の廣田です。
未経験入社で早3カ月たちました。
日々の業務のなかで得た知識などを書いていこうと思います。
高度な内容は書けませんが、同じように未経験からプログラミングを始めようと思ってらっしゃる方と共有できたり、学習の役に立てば良いなとおもいます。
今回は、型について備忘がてら書こうと思います。
phpの型指定
ベテランSEの方々には、当然の概念であろうデータ型。
恥ずかしながら、実業務のコードを見たときに一番初めにつまづいたところでした。
-型とは:整数型(int)や、文字列型(string)のようなデータ(値)の種類の分類のこと。
実業務のコードに出現した型指定はこんな以下のようなものでした。
public function findForListBox(Organization $org):array { return $this->createQueryBuilder('m') ->andwhere(m.organization = :org) ->..... }
メソッド名の後ろに「:(コロン)+ 型」で戻り値の型指定をするんですね。
このコロンが気になりすぎてネットで調べましたが、基礎的すぎるのか
型指定だと説明しているサイトはあまり無かったように思います。
プロジェクトで使っているフレームワーク、symfonyでは
アノテーションで記述したり。
/** * @param string $email * @param int $exclusiveId * @return bool */ public function existsByEmail(string $email, int $exclusiveId): bool { ...
型キャスト
そのままだと戻り値が意図した型にならず、エラーが返ってくることがあります。
例えば
public function __toString() { return $this->getId(); }
とすると以下のようなエラーがかえってきます。
「Return value of __toString() must be of the type string, integer returned」
先輩に聞いたところ、「キャストした形にして」とのこと。
キャスト?なにそれ楽しそう。ディズ〇ーランドのスタッフのことかしら、とか思ったのは秘密です。
型キャストを行うことで型の変換ができるんですね!
return (string)$this->getId();
とすると、string型に変換して返してくれます。
例: <?php $foo = 10; // $foo はintegerです $bar = (boolean) $foo; // $bar はtrue(boolean)です ?>
フォームの値をコントローラで$Request->get()するときに凡ミスした点
フォームのチェックボックスがチェックされたらDB登録する機能を作りたかったある日。
html <form> <input type="checkbox" name="isAgree" value="true">はい ... <button type='submit'>保存</button> </form>
controller $isAgree = $request->get("isAgree") if($isAgree){ $this->em->persist($user); $this->em->commit(); }
エラーになりました。
原因がわからず、しばらく考えこんでしまいましたが
とりあえずvar_dumo($isAgree)。
string(4)"true"
う~ん、値とれてるみたいだけど…
…ん?string?なぜ?
原因はhtml側で「value=”true”」としていたところでした。
bool値を返したいなら「value=true」としなくていけないんですね^^;;
勉強になりました。
まとめ
型について、完全には理解できていませんが、補完やバグ発見のためできるだけ戻り値を指定するべきとのことでした。
型を指定することで大きな問題になる前にエラーを特定できるなど
安全なプログラムを書くために有益なようです。
配列だと思ってたらオブジェクトだったり、
いまだにつまづくことが多い型ですが、よくわからなかったらとりあえずvar_dump()するようにしています。
そうすると該当のメソッドがどういう形で値を返してくるのかというメソッドへの理解や、初学者にはイメージしづらいオブジェクトの構造なんかも理解できたりします。
とりあえずエラーになったらvar_dump、
困ったらvar_dump、
暇になったらvar_dumpしてます。
入社から3カ月、
とりあえずvar_dumpとは友達になれたような気がします。