パーフェクトPHP 5.3.2 遅延的束縛がわからない仲間へ
パーフェクトphpを学習していて、遅延静的束縛で少し困惑したので、自分なりにわかりやすくまとめておきます。
多分、遅延静的束縛で混乱するところはselfとstaticの違いだと思います。 なんでselfからstaticに変えたら親クラスではなく子クラスのメソッドを呼び出せるのか。
まず、前提として理解しておきたいのは
・selfは定義時のクラスを示す
・staticは実行時のクラスを示す
この2点です。
では実際にコードで確認してみます。
<?php class Father { public function family() { self::member(); } public static function member() { echo '私は父です', PHP_EOL; } } class Son extends Father { public static function member() { echo '私は息子です', PHP_EOL; } } $son = new Son(); $son->family();
このコードは、Fatherクラスを継承したSonクラスのインスタンスを作り、自己紹介をしてもらうプログラムです。 Sonクラスのインスタンスを生成したので期待する結果は「私は息子です」なのですが、実行すると「私は父です」になってしまいます。
原因は「selfは実行時のクラスを示す」からです。 つまり、self::member();は実際には
Father::member();
となっていて親であるFatherクラスのmemberメソッドを参照してしまっているわけです。
これを解決するために self::memberの部分を
static::member();
に変更すれば、staticは実行時のクラスを示すので
Son::member();
という動きになり、期待していた出力結果の「私は息子です」になります。
これでインスタンスごとに特有の処理ができるので拡張性が高くなりますね! 以上が遅延静的束縛です。
ここまで読んでいただきありがとうございます。間違い等がありましたらご指摘いただければ幸いです。
rails チュートリアル第6版 1章 railsの環境構築でつまづいたところ
rails チュートリアル第6版で少し詰まったところをメモとして書き残しておきます。
gem install rails -v 6.0.0が失敗する
おそらくこういったエラーが出た方がいるかもしれません
ERROR: While executing gem ... (Gem::FilePermissionError) You don't have write permissions for the /Library/Ruby/Gems/2.3.0 directory.
これはgemをインストールするためのフォルダにアクセス権限がないよと言われている状態です。 私の場合のようにシステムのrubyを参照しているために権限がない可能性があります。 システムのrubyを参照しているかの調べ方は
rbenv versions
このコマンドを入力して
*system 2.3.7 2.5.3 2.7.1
systemに*が付いていたらシステム参照です。 その場合はrbenvで最新のrubyをinstallしてそちらを参照できるように設定しましょう! (2020/4/22時点最新安定version 2.7.1)
rbenv install 2.7.1
上記コマンドでインストール 次に下記のコマンドを入力
rbenv global 2.7.1
これで最新versionのrubyを参照した状態になったので gem install rails -v 6.0.0ができるようになったかと思います。
rails server が立ち上がらない
rails s コマンドでサーバーを立ち上げようとしたら下記のようなエラー文が出ました。
RAILS_ENV=development environment is not defined in config/webpacker.yml, falling back to production environment Exiting
どうやら config/webpacker.ymlがないため失敗しているらしいです *参考記事
https://www.srockstyle.com/develop/3641/
この記事を参考にまずは
brew install yarn
その後
bundle exec rails webpacker:install
これでサーバーが立ち上がりました。