エンジニアのひよこ_level10

毎日更新してた人。たまに記事書きます。

【Laravel】routeに名前空間(namespace)を使って、見やすい構成に【179日目】

こんな書き方あるよ

Route::group(['namespace' => 'Admin'], function () {
    // "App\Http\Controllers\Admin"名前空間下のコントローラ
});

何が嬉しいの?

App\Http\Controllers\Admin\SomeController.php
App\Http\Controllers\Admin\AnyController.php
App\Http\Controllers\User\SomeController.php
App\Http\Controllers\User\AnyController.php

こんな構成なら、下のように
■同じコントローラー名でも見やすく書ける
ディレクトリに分けてルートが書ける

Route::group(['namespace' => 'Admin'], function () {
    Route::get('admin/some', 'SomeController@show');
    Route::get('admin/any', 'AnyController@show');
});

Route::group(['namespace' => 'User'], function () {
    Route::get('some', 'SomeController@show');
    Route::get('any', 'AnyController@show');
});

参考ページ

ルーティング 5.3 Laravel

【PHP】null合体演算子とエルビス演算子(三項演算子)の違い【163日目】

ちょっと間違えていたので

こちらの方で内容を変えて書いています。こちらもご参考に

www.nyamucoro.com

null合体演算子とは

null合体演算子(A ?? B)は、
Aが nullundefinedの時に、Bを出力し、
非nullの時にはAを出力するものです。

例がundefinedやnullの場合の処理を考える時に便利です。

// undefinedなので、''が出力される
echo $item ?? '';

// nullなので、''が出力される
$item = null;
echo $item ?? '';

// 非nullなので、10が出力される
$item = 10;
echo $item ?? '';

エルビス演算子(三項演算子)とは

エルビス演算子(?:)は、評価がtrueかによって分岐します。
三項演算子とも呼ばれます。

シンプルなif文を短く書いたり、見やすくするために使われたりしますが、
三項演算子を好まない人もいるので、チームメンバーと事前に使うかどうか決めておくとより良いです。

$item = 10;

// isset($item)がtrueなので、$itemが出力される
echo isset($item) ? $item : '';

// 上の式は下と一緒
if (isset($item)) {
    echo $item;
} else {
    echo '';
}

$item = 1;
// ?と:の間を省略すると、
// $itemが1なので、trueと同等であることから、$itemが出力されます。
echo $item ?: '';

// 上の式は下と一緒
if ($item) {
    echo $item;
} else {
    echo '';
}

それぞれの公式ドキュメント

null 合体演算子 (??)

この演算子は、もし第一オペランドが非 NULL の値であればそれを返し、 そうでない場合は第二オペランドを返します。

http://php.net/manual/ja/migration70.new-features.php

エルビス演算子三項演算子)(?:)

(expr1) ? (expr2) : (expr3) という式は、式1 が TRUE の場合に 式2 を、 式1 が FALSE の場合に 式3 を値とします。

式 expr1 ?: expr3 の結果は、expr1 が TRUE と同等の場合は expr1、 それ以外の場合は expr3 となります。

http://php.net/manual/ja/language.operators.comparison.php

【PHP】多態性(ポリモーフィズム)について勉強中【162日目】

元となる抽象クラス

<?php
abstract class baseClass
{
    abstract public function action();
}

継承先のクラス2つ

class ringoClass extends baseClass
{
    public function action() 
    {
        echo '私はりんごだよ';
    }
}
class orangeClass extends baseClass
{
    public function action() 
    {
        echo '私はオレンジだよ';
    }
}

動作させるコード

$r_class = new ringoClass;
$o_class = new orangeClass;

$r_class->action();
$o_class->action();

同じクラスを継承して、『同名のクラスを持つけど、別の動作してる』って話・・・?

Javaだと、$r_classと$o_classをbaseClass型で受け取るから、イメージがついた感じしたけど、
PHPで作ってみて、ポリモーフィズムがますますわからなくなった・・・

【PHP】??。undefinedに対してifを書くときにissetを使わない方法。【161日目】

undefindedの時に、空文字を出したい

if (isset($item)) {
    echo $item;
} else {
    echo '';
}

あるいは、三項演算子を使って

    echo (isset($item) ? $item : '')

これをnull 合体演算子 (??)を使って書く

null合体演算子

    echo ($item ?? '');

短い。見やすい。便利ね。

公式ドキュメント

PHP: 新機能 - Manual

【PHP】フレームワーク使わずルーティングしたかった【144日目】

前提・ゴール

nginx等で、強制的にindex.phpを読み込ませる

index.phpから、URIに合わせて、別ファイルを読み込ませるのをゴール

手順

URIを取得

②クエリと分ける

URIに合わせてinclueするファイル分ける

書いたコード

index.php(①と②を担当)

<?php
$uri = $_SERVER['REQUEST_URI'];
$query = $_SERVER['QUERY_STRING'];
$uri = str_replace('?' . $query, '', $uri);

include 'route/route.php';

route.php

<?php
if ($uri === '/hogehoge') {
    include 'answer/hogehoge.php';
} else if ($uri === '/hugahuga') {
    include 'answer/hugahuga.php';
} else {
    include 'answer/other.php';
}

悩み

includeでファイル見つからなかった時の対応書けてない

そもそもinclude、require以外でルーティング実装する方法思いつかなかった

どなたかアドバイスいただけたら嬉しいです。
こんなものなのかなぁ・・・

laravelの環境構築で参考にしたサイト一覧【125日目】

基本形

qiita.com

Nginx + php-fpmの環境を作ろうとしたらPHPファイルがダウンロードされる

utano.jp

mcryptをphp7.2でもインストールする方法

blog.apar.jp

ぼやき

とりあえずわからないところは極力削って環境構築。

わからないままコピペよくない。

一応手元でLaravelの基本ページを表示出来るとこまでいけました。

さて、切りが良いので次はGoの勉強に戻ります。また落ち着いたらLaravelでてきとーなサイトをECS使いながら公開するとこまで行きたいところ。

動作が落ち着いたらgithubで公開しますね。

php7.2でmcryptがインストールできない問題【124日目】

Dockerやってたらmcryptがインストールできない

なんでだーってなった。

コマンド間違えてないはずなのに、

/usr/src/php/ext/mcrypt does not exist

って出る。なぜだ。

でもきっと私の記述が間違ってるんだ・・・

そう思ってた

mcryptはPHP7.1で非推奨、7.2で消えました

PHP: はじめに - Manual

This feature was DEPRECATED in PHP 7.1.0, and REMOVED in PHP 7.2.0.

あっ・・・
ってことで、php7.2ではmcrypt消されてるやつですね。

この拡張モジュールは » PECL レポジトリに移動 されており

ってことで、必要な方はPECL使ってインストールしてくださいとのこと。

一応非推奨ですが。

オモイコミ、ダメ、ゼッタイ

完全に私の記述がきっと間違えてるんだろうって思いながら検索ワード入れてたから、
全然見つかりませんでした・・・

エラーメッセージで検索しても、コマンドの順番違うよとか書いてて、
いや、間違えてないはずなのに・・・って思いながら書いてました。
こんなのに2時間かけるとか・・・

ってことで、オモイコミ、ダメ、ゼッタイ。

おまけ:初心者がDockerを勉強した本

■対象の人:環境構築わからない・・・インフラ用語わからない・・・

プログラム書けるけど、インフラ用語わからない、環境構築してみたいけどできない。

私がそうでしたが、以下の本で勉強しました。

インフラの用語を一から説明してくれて、その後にDockerの話をしてくれるので初心者向けです。
Laravelの環境くらいなら、一人で書けるようになりました。

アフィリエイトリンク貼ると、胡散臭くなるけど、単純におすすめしたい本(`・ω・´)ゞ

疑似乱数を、再現可能な値にする方法【120日目】

何が嬉しいの?

擬似乱数を再現可能にすると、
バグとかの再現も出来る。

ドキュメント

PHP: mt_srand - Manual

PHP: mt_rand - Manual

結論

$seed = 10;
mt_srand($seed);
echo mt_rand(0, 255);
echo mt_rand(0, 255);
echo mt_rand(0, 255);

mt_srand($seed);
echo mt_rand(0, 255);
echo mt_rand(0, 255);
echo mt_rand(0, 255);

実行結果

php > $seed = 10;
php > mt_srand($seed);
php > echo mt_rand(0, 255);
9
php > echo mt_rand(0, 255);
125
php > echo mt_rand(0, 255);
228
php >
php > mt_srand($seed);
php > echo mt_rand(0, 255);
9
php > echo mt_rand(0, 255);
125
php > echo mt_rand(0, 255);
228

どういうこと?

mt_srandにシード値と呼ばれる値を入れると、
そのシード値に合わせた乱数のテーブルが出来上がる。

シード値が同じであれば、
乱数の出てくる順番が同じものになるわけです。

応用

暗号もどき。シード値を共有すれば暗号っぽくなるのかな。

<?php
    $seed = "20";

    $word = "ABCDEFGabcdefg";
    check_enc($word, $seed);

    $word = <<<EOF
    テストの文です。
    これではどうなるでしょうか。
EOF;
    check_enc($word, $seed);

    function check_enc($word, $seed)
    {
        $en = enc2($word, $seed);
        $de = dec2($en, $seed);

        echo "元の文字列:" . $word . PHP_EOL;
        echo "暗号化した文字列:" . $en . PHP_EOL;
        echo "複合した文字列:" . $de . PHP_EOL;

        if ($de === $word) {
            echo "OK!" . PHP_EOL;
        } else {
            echo "NG!" . PHP_EOL;
        }
    }

    //文字を配列に変えてforeach
    //ASCII文字に変換→1足してずらす→文字に戻す
    //配列を文字列に戻す
    function enc2($word, $seed)
    {
        mt_srand($seed, MT_RAND_MT19937);
        foreach(str_split($word) as $char) {
            $char_array[] = chr(ord($char) + mt_rand(0, 255));
        }
        $encripted = implode($char_array);
        return $encripted;
    }

    function dec2($encripted, $seed)
    {
        mt_srand($seed, MT_RAND_MT19937);
        foreach(str_split($encripted) as $char) {
            $char_array[] = chr(ord($char) - mt_rand(0, 255));
        }
        $word = implode($char_array);
        return $word;
    }

実行結果

元の文字列:ABCDEFGabcdefg
暗号化した文字列:�R#� ��y�F�
複合した文字列:ABCDEFGabcdefg
OK!
元の文字列:    テストの文です。
    これではどうなるでしょうか。
暗号化した文字列:��/�]w��*%hY���������gWs��&�^���L��h����l�.���O۬7��q�I�Y3�@���
複合した文字列:    テストの文です。
    これではどうなるでしょうか。
OK!