Upgrade to Pro — share decks privately, control downloads, hide ads and more …

20230215PHP勉強会.pdf

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for gallu gallu
February 14, 2023
65

 20230215PHP勉強会.pdf

Avatar for gallu

gallu

February 14, 2023
Tweet

Transcript

  1. 抽出方法  ごく大雑把にはこんな感じです  (一応、コードはgithubにあるんで、興味がある!!って反応 があったらURLどこかに貼り付けておきます ノ) RecursiveDirectoryIteratorつかって指定ディレクトリ配下のファイルをサーチ ファイルの拡張子が .php以外なら

    continue token_get_all()使ってtokenに分解する tokenがT_STRINGの場合 function_exists()で引っかかったら「多分、関数なんじゃね?」って事でカウント else class_exists()で引っかかったら「多分、クラス名なんじゃね?」って事でカウント else マジックメソッド一覧(これは配列で持ってる)で引っかかったら「多分、マジック メソッドなんじゃね?」って事でカウント
  2. 調査対象  対象は以下の通り。  大雑把に「大体、この辺にコードがあるだろう」で狙い 撃ってます。もしかしたら漏れがあるかもなので、その辺 を踏まえてご覧ください。 Laravel https://github.com/laravel/framework Laravel/src/

    cakePHP https://github.com/cakephp/cakephp cakephp/src/ Symfony https://github.com/symfony/symfony symfony/src Slim https://github.com/slimphp/Slim Slim/Slim/ Wordpress https://github.com/WordPress/WordPress WordPress/ EC-CUBE https://github.com/EC-CUBE/ec-cube ec-cube/src/ Drupal https://github.com/drupal/drupal drupal/
  3. フレームワーク編。まずはLaravel  InvalidArgumentException クラスが入っている (コード的に書かれている)あたりが「フレームワーク だなぁ」って感じですかねぇ。  func_get_args()が「懐かしい」感じではあります (今だと3点リーダ使った書き方のほうがポピュラー ですかねぇ)。

     その一方で「str_contains()」がすでに入っている辺りが とても味わい深いです……いやまぁ実際「わかりやす い」ですしねぇ。  30位に滑り込んだ「__call()」は……個人的にはよく使 うんですが、一般的にはどうなんですかね?  (逆に「compact()」は、全然使わないんですよね……) "f:is_null": 617, "cm:__construct": 571, "c:closure": 513, "f:count": 340, "f:is_array": 339, "f:array_merge": 290, "f:is_string": 214, "f:in_array": 207, "f:str_replace": 200, "f:implode": 191, "c:invalidargumentexception": 190, "f:func_get_args": 188, "f:method_exists": 185, "f:sprintf": 176, "f:explode": 176, "f:trim": 167, "c:runtimeexception": 161, "f:get_class": 145, "c:exception": 134, "f:function_exists": 102, "f:str_contains": 101, "f:array_map": 100, "f:is_numeric": 88, "f:array_values": 87, "f:compact": 86, "f:json_encode": 85, "f:array_filter": 84, "f:call_user_func": 84, "f:array_key_exists": 80, "cm:__call": 79,
  4. 続いてcakePHP  Laravelと割と似たような感じが多いですね。  「hash()」が比較的上位に来ているのが 興味深いところです。  「is_array()」とか「is_string()」とか「is_int()」とかが 上位なのは、フレームワークだから、ですかねぇ? 

    後はまぁ「割と普段使っている関数が多いなぁ」 と思いました。 "f:sprintf": 514, "f:is_array": 394, "cm:__construct": 352, "f:count": 271, "c:invalidargumentexception": 268, "f:implode": 260, "f:strpos": 246, "c:runtimeexception": 240, "f:is_string": 228, "f:in_array": 212, "f:substr": 183, "f:explode": 160, "f:array_merge": 146, "f:str_replace": 132, "f:hash": 127, "c:closure": 123, "f:preg_match": 115, "f:array_keys": 99, "f:strtolower": 94, "f:array_filter": 88, "f:is_numeric": 83, "f:current": 77, "f:extract": 77, "c:pdo": 75, "f:array_map": 74, "f:strlen": 72, "f:is_int": 69, "f:array_key_exists": 69, "f:trim": 61, "f:get_class": 61,
  5. お次はSymfony  cakePHPでも思ったのですが「sprintf()」がすごい(笑  こちらも「str_starts_with()」「str_contains()」が上位に 来ていて、やっぱりPHP8は便利だなぁ、と。  あと「microtime()」とか「serialize()」とか  「range()」も興味深いですねぇ

     ジェネレータの使用頻度調べると面白いかも(未調査  「get_debug_type()」は、他では上位に入ってきていない ので興味深いですね  個人的にはよく使います "f:sprintf": 3800, "cm:__construct": 2753, "f:end": 1301, "c:invalidargumentexception": 1018, "f:substr": 816, "f:implode": 694, "f:class_exists": 682, "f:str_replace": 514, "c:logicexception": 514, "f:key": 506, "f:array_merge": 475, "c:runtimeexception": 446, "f:preg_match": 445, "f:array_keys": 443, "f:getenv": 384, "f:str_starts_with": 368, "f:get_debug_type": 339, "f:time": 303, "f:str_contains": 302, "f:explode": 293, "f:json_encode": 293, "f:trim": 291, "f:file": 291, "f:array_map": 289, "f:microtime": 275, "f:serialize": 247, "f:range": 245, "f:current": 235, "f:preg_replace": 230, "f:reset": 220,
  6. フレームワーク勢の最後はSlim  そもそもファイル数が少ないからカウントの数も 控えめですねぇ、ってのは置いておくとして。  こちらもまぁ「ほかのフレームワークでも、(ここでは 書いてないにしても)比較的入り込んでる関数が 無難に入ってる」感じがします。  「connection_status()」が割とレアですかねぇ。

    「クライアントとの接続状況を確認する」関数ですが、 これはあんまり使った記憶がないです。  「class_exists()」とか「get_class()」とかは、フレーム ワークだとよく使う気がします  「htmlentities()」が入っているのが興味深いです "c:runtimeexception": 44, "cm:__construct": 31, "f:sprintf": 30, "f:is_string": 14, "f:is_array": 12, "cm:__invoke": 12, "f:next": 11, "f:class_exists": 10, "f:get_class": 10, "f:array_key_exists": 8, "c:closure": 8, "f:is_callable": 8, "c:exception": 7, "c:invalidargumentexception": 6, "f:implode": 6, "f:in_array": 6, "f:get_called_class": 6, "f:preg_match": 6, "f:count": 5, "f:explode": 5, "f:is_object": 5, "f:htmlentities": 5, "f:array_reverse": 4, "f:rawurldecode": 4, "f:strtoupper": 4, "f:strtolower": 4, "f:json_encode": 4, "f:dirname": 3, "f:file_exists": 3, "f:connection_status": 3,
  7. 続いてアプリケーション編からWordpress  フレームワークとは大分違う顔ぶれが見えていま す……が、関数自体はそれほど「突拍子もない」のは ない感じですね。  そしてここでも光る「substr()」と「sprintf()」(笑  フレームワークだと最上位付近にいた「__construct()」 が中段なのは面白いですね

    "f:substr": 2935, "f:sprintf": 2443, "f:in_array": 1007, "f:is_array": 945, "f:strlen": 873, "f:printf": 805, "f:strpos": 728, "f:count": 670, "f:trim": 643, "f:str_replace": 639, "f:implode": 612, "f:define": 610, "f:preg_match": 541, "f:function_exists": 533, "f:defined": 506, "f:preg_replace": 435, "f:array_merge": 426, "f:explode": 417, "cm:__construct": 410, "f:is_string": 400, "c:error": 374, "f:array_keys": 304, "f:strtolower": 296, "f:array_key_exists": 294, "f:array_map": 285, "f:is_callable": 277, "f:time": 248, "f:ord": 234, "f:file_exists": 208, "f:array_unique": 182,
  8. 続いてEC-CUBE  「Errorクラス」が上位に来るのはここが初見かも…… と思ったらWordpressでも出てましたね  ほか、いくつか「お仕事ではちょいちょい使うけど、 このベスト30だと見かけない関数」がちょろちょろ 散見されます  「assert()」は、フレームワークとかでは見なかった

    ですね  30位ではありますが、「date()」が入ってきてます "cm:__construct": 404, "f:flush": 137, "f:count": 120, "f:is_null": 118, "f:assert": 70, "f:str_replace": 68, "f:class_exists": 68, "f:sprintf": 52, "f:preg_match": 51, "f:file_exists": 50, "f:array_merge": 34, "f:array_filter": 33, "f:strpos": 30, "f:in_array": 30, "f:array_map": 30, "f:constant": 28, "f:explode": 28, "f:file": 26, "c:error": 24, "f:implode": 23, "f:array_key_exists": 22, "f:array_keys": 21, "f:current": 20, "f:preg_replace": 20, "f:end": 20, "f:copy": 19, "f:file_get_contents": 19, "f:key": 19, "f:realpath": 19, "f:date": 18,
  9. 最後、Drupal  比較的「よく見かける関数」が、やはり多い感じですね  「file_get_contents()」はEC-CUBEでも見かけているの ですが「file_put_contents()」が上位なのはここだけです  「file()」、メモリとの兼ね合いがあるので使うシーンは 個人的には限定的にしているのですが、ここ含めて 時々見かけるのが面白いですね

    "cm:__construct": 2302, "f:count": 1213, "f:array_keys": 1168, "f:sprintf": 687, "f:implode": 656, "f:in_array": 601, "f:is_array": 584, "f:reset": 548, "f:explode": 498, "f:array_merge": 494, "f:array_filter": 415, "f:assert": 398, "f:substr": 378, "f:str_replace": 373, "f:array_map": 367, "f:strpos": 341, "f:sort": 340, "f:file": 326, "f:link": 304, "f:serialize": 299, "f:gettype": 283, "f:preg_match": 279, "f:strtolower": 270, "f:array_values": 261, "f:trim": 244, "f:realpath": 237, "f:file_put_contents": 233, "f:file_get_contents": 222, "f:strlen": 215, "f:mb_strtolower": 212,
  10. トータル  「sprintf()」さん堂々の第一位(笑  「__construct()」もまぁ使いますよねぇ、 の第二位。  第三位は「substr()」。まぁ文字列の 切り抜きはどこに行っても。 

    全体的に「あぁ使った事あるなぁ」な 関数が多いですね "f:sprintf": 7702, "cm:__construct": 6823, "f:substr": 4370, "f:count": 2807, "f:implode": 2442, "f:is_array": 2309, "f:array_keys": 2091, "f:in_array": 2070, "f:str_replace": 1928, "f:array_merge": 1865, "f:explode": 1577, "c:invalidargumentexception": 1561, "f:preg_match": 1514, "f:end": 1486, "f:strpos": 1482, "f:trim": 1416, "f:strlen": 1218, "f:array_map": 1145, "f:class_exists": 1083, "f:is_string": 1025, "f:is_null": 951, "f:reset": 951, "f:preg_replace": 936, "f:strtolower": 916, "c:runtimeexception": 903, "f:array_filter": 892, "c:error": 841, "f:printf": 807, "f:key": 805, "f:file": 790, "f:function_exists": 788, "f:time": 775, "f:array_values": 705, "f:serialize": 691, "f:array_key_exists": 690, "f:define": 672, "f:gettype": 666, "c:closure": 651, "c:logicexception": 630, "f:defined": 613, "f:current": 597, "f:str_starts_with": 587, "f:assert": 564, "f:file_exists": 559, "f:sort": 528, "f:is_numeric": 526, "f:method_exists": 508, "f:file_get_contents": 508, "c:exception": 481, "f:getenv": 472, "f:realpath": 460, "f:range": 454, "f:json_encode": 449, "f:str_contains": 444, "f:link": 441, "f:file_put_contents": 431, "f:str_repeat": 429, "f:get_class": 421, "f:is_callable": 403, "f:hash": 393,
  11. 「マジックメソッドの使用頻度」をtotalで  この辺も色々と思うところが山盛りで出そうな 感じですが  個人的には(元々C++ルートから来ていてなじみが あるので)「デストラクタが思ったより健闘している んだなぁ」とか思ったりはしています。 "cm:__construct": 6823,

    "cm:__invoke": 177, "cm:__call": 139, "cm:__sleep": 110, "cm:__get": 100, "cm:__destruct": 99, "cm:__serialize": 78, "cm:__unserialize": 78, "cm:__clone": 77, "cm:__wakeup": 67, "cm:__isset": 56, "cm:__set": 46, "cm:__unset": 31, "cm:__set_state": 1,
  12. 余談で globalキーワードと$GLOBALS変数の使用頻度  FWは「あまり使ってない」印象です  使用箇所は軽く調べたのが次頁に  アプリケーションは「作り次第」なのか 「開発スタンス次第」なのか、って感じ ですかね

    Laravel/src/ use global global使用 0 $GLOBALS使用 0 cakephp/src/ use global global使用 0 $GLOBALS使用 2 symfony/src/ use global global使用 1 $GLOBALS使用 2 Slim/Slim/ use global global使用 0 $GLOBALS使用 0 WordPress/ use global global使用 1096 $GLOBALS使用 253 ec-cube/src/ use global global使用 0 $GLOBALS使用 0 drupal/ use global global使用 57 $GLOBALS使用 178
  13.  フレームワーク側が興味深いので軽くgrep  テストで使ってる感じ、ですねぇ cakePHP ./TestSuite/Fixture/SchemaLoader.php: if (isset($GLOBALS['__PHPUNIT_BOOTSTRAP'])) { ./TestSuite/Fixture/SchemaLoader.php:

    if (isset($GLOBALS['__PHPUNIT_BOOTSTRAP'])) { Symfony . /Component/VarDumper/Tests/Dumper/CliDumperTest.php: foreach (array_keys($GLOBALS) as $var) { . /Component/VarDumper/Tests/Dumper/CliDumperTest.php: unset($GLOBALS[$var]); . /Component/VarDumper/Tests/Dumper/CliDumperTest.php: return eval('return [$var(), $GLOBALS, &$GLOBALS];'); . /Bridge/PhpUnit/bin/simple-phpunit.php:global $argv, $argc;
  14. おまけ:「1回しか出てこない」関数群 array_diff_uassoc(), array_intersect_uassoc(), password_get_info(), mb_strimwidth(), forward_static_call(), compileerror(), getservbyname(), __set_state(), fnmatch(),

    readline_add_history(), closelog(), highlight_string(), is_finite(), stream_get_line(), openssl_free_key(), ob_list_handlers(), array_udiff_assoc(), mb_strripos(), curl_share_init(), openssl_x509_read(), curl_multi_strerror(), curl_strerror(), curl_multi_select(), session_set_cookie_params(), session_unset(), memory_get_peak_usage(), gc_enable(), is_infinite(), mb_convert_variables(), session_create_id(), setrawcookie(), ob_get_status(), connection_aborted(), ob_implicit_flush(), date_create_immutable(), get_declared_interfaces(), dom_import_simplexml(), hash_pbkdf2(), error_clear_last(), pcntl_wexitstatus(), sem_remove(), getopt(), array_intersect_ukey(), ctype_print(), openssl_pkcs7_encrypt(), openssl_pkcs7_decrypt(), stream_filter_remove(), spl_autoload_call(), zend_version(), finfo_close(), exif_imagetype(), mb_detect_order(), xml_set_default_handler(), xml_set_start_namespace_decl_handler(), xml_set_end_namespace_decl_handler(), stream_set_read_buffer(), stream_set_chunk_size(), socket_set_blocking(), get_html_translation_table(), socket_set_timeout(), socket_get_status(), utf8_decode(), ini_get_all(), curl_multi_close(), openssl_get_cipher_methods(), strftime(), mb_list_encodings(), mb_get_info(), xmlreader(), is_double(), timezone_transitions_get(), is_writeable(), php_sapi_name(), is_long(), dl(), ob_get_length(), quoted_printable_decode(), stream_bucket_make_writeable(), stream_bucket_append(), stream_set_write_buffer(), srand(), rewinddir(), deg2rad(), cos(), sin(), filter_input(), time_sleep_until(), mb_regex_encoding(), mb_ereg(), str_shuffle()
  15. まとめ  「高頻度で出てくる関数」が必ずしも「よく使われている か?」は色々と議論もあろうかと思いますが  とりあえず「見た事が無い関数が出てきたら調べる」くら いのことをやっておくと、知識が増えるんじゃないか、と 思います + 

    初学者に教える時は「この辺はよく使われるぞ~」ってお 話の根拠になるので(笑)  勉強の指針にはなるんじゃないかなぁ、と  実際使われているので、簡単な「例題になるコード」も書 きやすいので、教えやすいんじゃないか、と思います