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

20230215PHP勉強会.pdf

gallu
February 14, 2023
56

 20230215PHP勉強会.pdf

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. まとめ  「高頻度で出てくる関数」が必ずしも「よく使われている か?」は色々と議論もあろうかと思いますが  とりあえず「見た事が無い関数が出てきたら調べる」くら いのことをやっておくと、知識が増えるんじゃないか、と 思います + 

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