ひょうきんエンジニア

Web開発のこととか、読書録とか。

「PHPはどう動くのか」を読んだ

まえがき

積ん読消化の手引きが書かれた素晴らしい記事を読んだので、実践してみようと思う。
note.mu

自身の備忘録&読書のモチベーション向上、あとは自分の感想を見て参考にしてくれる人が世の中に1人でもいたら嬉しいという心持ちです。


タイトル

PHPはどのように動くのか ~PHPコアから読み解く仕組みと定石

PHPはどのように動くのか ~PHPコアから読み解く仕組みと定石

PHPはどう動くのか 〜PHPコアから読み解く仕組みと定石


なぜ読もうと思ったか

職場の先輩がオススメしていたし、前から気になっていたから。
Kindle版を買って、通勤時間とかで読んだ。


読了した感想など

一言で言うと

PHPの言語処理系についての入門書的立ち位置と思われる。良い。すごく良い。ただし、より深く追うためには自分でソースを読んだりPHPマニュアルを見る必要がある。当たり前か。

感想箇条書き

  • PHP内部のことについて色々知れる。面白いしみんな読むべき
  • オペコードそのものの解説とかはないので詳しいことは自分で調べる必要がある
  • PHP7はなぜはやいのか、の章が一番良かった。
  • 文字列構造体とかが持っているコピーオンライト判定用のzend_refcounted構造体の変数名がgcなのがいいなと思ってにやっとしてしまった(気持ち悪い)
  • メモリを富豪的に使うことでパフォーマンスを向上させるアプローチが随所に見られた。ソフトウェアもハードウェアとともに進化していくといういい例だと思った
  • 自分の無知を噛みしめる良い機会になった

実はよく分かっていないところ

PHP7のHashTableの構造が微妙によく分からなかった。Bucketのリストはどう持ってるのやら。
あと、「第7章 Zend Engineをハックする」はほぼ流し読みしかできていない。いつかもう一度読みたい。というか、この章は読むだけだと眠すぎる。ちゃんと写経して動かした方が良さげ。


読んだ後どうするか

第1〜3章および第5章の内容を心に留めて、なるべくパフォーマンスの良いプログラムを書けるよう意識する。内容忘れそうなので1章と2章は繰り返し読みたい。
また、PHP7へのバージョンアップを推進するときの材料が増えた。
あとはPHP: PHP のコア: ハッカーの手引き - Manualを読んでみようという気持ちになった。

CakePHPでComponentディレクトリ直下以外に置いたComponentを読み込む方法

タイトルの通り、src/Controller/Component/ 直下以外の場所にComponentを置いてControllerからloadしたい場合。なぜか公式にやり方が書いていなかったのでメモ。

バージョン

CakePHP 3.x

書き方

例えばsrc/Controller/Component/SubDir/AbcdComponentをloadしたい場合は以下のように書けば良い

// In Your Controller
$this->loadComponent('Abcd', [
    'className'=> '\App\Controller\Component\SubDir/AbcdComponent'
]);

備考

上記でちゃんと動きますが表記が冗長な感じですし、公式に載っていないということはおそらく推奨されていないということなので、大人しくComponent/直下に置きましょう。Componentの数が増えたりNamespaceを切りたいということであればPluginにしてしまうのが良さそうです。

JSでモジュール化するならとりあえずこれ、ってやつ

普段書かないNode.jsをたまに書くと、モジュール化のやり方を思い出せなくて困る。

ググると詳細な解説記事がたくさん出て来るが、やり方がいくつかあって結局どれか悩むので、自分用にメモっておく。

とりあえず現時点では大抵のライブラリと同じようにmodule.exports/requireを使えばいいと思われる。

// module_sample.js
function hello() {
  return "Hello, Module!";
}

module.exports = hello;
// require_sample.js
function hello() {
  return 'Hello, World!';
}

const module_hello = require('./module_sample.js');

console.log(hello());
console.log(module_hello());
$ node require_sample.js

#=> Hello, World!
#=> Hello, Module!

複数の関数をエクスポートしたいときはオブジェクトのプロパティに突っ込む感じで。

// module_object.js
module.exports = {
  hello() {
    return "Hello, Module Object!";
  },
  bye() {
    return "Bye, Module Object.";
  },
};
// require_sample2.js
function hello() {
  return 'Hello, World!';
}

const module_object = require('./module_object.js');

console.log(hello());
console.log(module_object.hello());
console.log(module_object.bye());
$ node require_sample2.js

#=> Hello, World!
#=> Hello, Module Object!
#=> Bye, Module Object.

その他メモ。

  • オブジェクトのエクスポート時はexports.hello = function(){...} とも書けるけど別にmodule.exportsでいい気がする

  • ブラウザ上のJSでこの構文を使いたい場合はwebpack等が必要

  • ES6ネイティブのexport/importが主流になる可能性もあるがまだ早い

  • その他の方法(AMDとか)を使うメリットはおそらくないので使わない

ブログ作った

技術っぽいことやぽくないことなどをアウトプットしたいと思い、ブログを作ることにした。しかし、選択肢が複数ありずいぶん悩んだ。具体的には下記のようなフローで意思決定をした。

  • 勉強を兼ねて、なんか新しい技術を(無駄に)ふんだんに使ってブログを構築しよう!無駄にSPAにしてPWAにしてdev.to並みの爆速サイトにしよう!Reactかな…裏はBFF…API Aggregation…SSR…ワクワク…
  • いや待て、そんなのやったことないしいつ出来上がるか分かったんもんじゃない、とりあえずRailsとかの慣れた技術スタックでサクッと作ったほうがいいのでは
  • いやいや、よく考えたら動的である必要すらないのだから静的サイトジェネレーターでええやん。Jekyllとかいうのがあった気がするぞ
  • てかWordPressにすれば一瞬で構築できるやん。AWSWordPress入ってるイメージみたいなのあった気がするし
  • と色々考えたけど、目的は「ブログを書くこと」であって同時に色々やろうというのは良くない。純度が低い。純度が大切。純度を高めよう。手間を最低限におさめるには…普通に適当なブログサービス使うよね普通に。ええ。

てな訳でこんにちははてなブログ。これからよろしく。

今の所、決まっているのはブログタイトルのみ。ブログのコンセプトとかどんなカテゴリの記事書くとかなーんにも考えてないけど、とりあえず自分と誰かもう一人くらいが読んでくれたらいいやという思考で何かしらアウトプットしていく所存。最近アウトプット筋が大分落ちている気がするので、徐々に取り戻していかねば…。