パーフェクト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

これでサーバーが立ち上がりました。