エンジニアのひよこ_level10

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

このPHPのコードのメモリの扱いがわからない。【101日目】

問題のプログラム

php > echo memory_get_usage();
350552
php > class A {
php { public $number = 10;
php { }
php > echo memory_get_usage();
351040
php > $a = new A();
php > echo memory_get_usage();
351096
php > $b = new A();
php > echo memory_get_usage();
351184
php > $a->number = 12;
php > echo memory_get_usage();
351696
php > $b->number = 11;
php > echo memory_get_usage();
351696
php > echo $a->number;
12
php > echo $b->number;
11

ここはわかる

php > $a = new A();
php > echo memory_get_usage();
351096
php > $b = new A();
php > echo memory_get_usage();
351184
php > $a->number = 12;
php > echo memory_get_usage();
351696

インスタンス生成した時点ではclassのコピー扱いなのかな、$a->number = 12;で値を変えることでコピーとして扱えないから、新たにメモリにclassAのコピーを展開するからメモリが増えると予測は出来る

でもこれがわからん

php > $a->number = 12;
php > echo memory_get_usage();
351696
php > $b->number = 11;
php > echo memory_get_usage();
351696

なぜ増えない・・・$a$bは異なる変数のはずなのに・・・

日記

PHPについていっぱいお勉強する週間。

シンボリックテーブルとか、参照渡しとかいろいろ勉強した。

参考サイトが出たらまた記事にまとめたいところ。

ただ、これが解決しないと、理解が出来たと言えない・・・なんだこれ・・・

PHPの参照渡しのメモ【99日目】

参照サイト

PHP: リファレンスとは? - Manual

PHP: リファレンス渡し - Manual

伝える内容候補

極力参照渡しでメソッド作らない方が良い
普通のメソッドは、値を直接書き換えてるわけじゃないよ。コピーを使ってるんだよ。
メモリの存在←ここまで説明するとなると骨が折れる気がする

参照渡しを使うとどうなるか

引数に渡した変数の値が変更される。

使う側が予想していない値に変わる可能性がある。

普通の関数との違い

参照渡しするメソッドは、破壊的なメソッドと呼ばれる

function swap($a, $b)
{
  $temp = $a;
  $a = $b;
  $b = $temp;
}
function swap2(&$a, &$b)
{
  $temp = $a;
  $a = $b;
  $b = $temp;
}

2つの違いは、メソッドを実行した後、使用した変数が変化していること

普通のメソッドの場合

$x = 1;
$y = 2;

swap($x, $y);
echo $x;
echo $y;

1,2の順で表示されて、$xと$yの値は変更されない。

$x = 1;
$y = 2;

swap2($x, $y);
echo $x;
echo $y;

2、1の順で表示されて、数値が入れ替わっているのがわかる。

日記

来週会社で説明する予定の参照渡しについて。

何を説明しなきゃいけないか、がまとまらない。

説明したい内容が固まれば、それに合わせて説明の内容が変わるので、それをよく考えなきゃ。

今の所

PHPの$a=$bが、$aをreturnしているのを調べよう【97日目】

導入のきっかけ

willow710kut.hatenablog.com

なので、=が関数なら、何をreturnしてるか調べようってお話

書いたプログラム

$a = 0;
var_dump($a);
var_dump($b);
var_dump($a = $b);
var_dump($a);
var_dump($b);
var_dump($a = $a);
var_dump($a = $b = $c);

実行結果

php -a使って確認。php7.0です。

見にくいので改行入れました。

php > $a = 0;

php > var_dump($a);
int(0)

php > var_dump($a = $b);
PHP Notice:  Undefined variable: b in php shell code on line 1
Notice: Undefined variable: b in php shell code on line 1
NULL

php > var_dump($a);
NULL

php > var_dump($b);
PHP Notice:  Undefined variable: b in php shell code on line 1
Notice: Undefined variable: b in php shell code on line 1
NULL

php > $a = $b;
PHP Notice:  Undefined variable: b in php shell code on line 1
Notice: Undefined variable: b in php shell code on line 1

php > var_dump($a = $a);
NULL

php > var_dump($a = $b = $c);
PHP Notice:  Undefined variable: c in php shell code on line 1
Notice: Undefined variable: c in php shell code on line 1
NULL

それぞれの原因を予想しよう

代入。

php > $a = 0;

php > var_dump($a);
int(0)

$aに代入。echoしてないので返り値は見れないです。
ということで、これは標準出力に吐き出しているわけではない模様。

var_dumpは引数の型や値を出力してくれる便利関数。今の$aはint型で0みたいですね。

=の出力

php > var_dump($a = $b);
PHP Notice:  Undefined variable: b in php shell code on line 1
Notice: Undefined variable: b in php shell code on line 1
NULL

php > var_dump($a);
NULL

php > var_dump($b);
PHP Notice:  Undefined variable: b in php shell code on line 1
Notice: Undefined variable: b in php shell code on line 1
NULL

var_dump($a = $b)var_dump($a)var_dump($b)を比較すると、

var_dump($a = $b)のまえに$bを読み込んで
PHP Notice:  Undefined variable: b in php shell code on line 1
Notice: Undefined variable: b in php shell code on line 1
を出し、その後、
$aを出力した

と予測されますが・・・その前に、$a = $bで$bがエラーを吐かずに$bだけ出力した可能性が残されてます。

代入単体でテスト

php > $a = $b;
PHP Notice:  Undefined variable: b in php shell code on line 1
Notice: Undefined variable: b in php shell code on line 1

php > var_dump($a = $a);
NULL

あ、$a = $bでエラー出してますね。これは仮定が正しそう。
そして、var_dump($a = $a)すると、$a = $aがちゃんと値をreturnしてるっぽいですね。

3つ繋いだ場合は?

php > var_dump($a = $b = $c);
PHP Notice:  Undefined variable: c in php shell code on line 1
Notice: Undefined variable: c in php shell code on line 1
NULL
  1. $c→エラー
  2. $bにNULL代入、$bを出力
  3. 出力された$b(NULL)を$aに代入
  4. $aを出力→NULL

って感じで私は$a = $b$aを出力したと予想しました!

結論:何事も試してみる大切。

頭で考えていただけだと、$aと$bのどちらを出力するのかわからなかったので、
コードを書いて試してみるとか、ドキュメント読むとか、元のソースコードを追うとか大切。

日記

100日目まであと3日!

100日目に書く記事何も考えてない!!!

とりあえず、少しずつ勉強する生活が安定してきました!

ブラックの会社の人より、自由時間使って勉強しないと置いていかれるって聞いて、
なるほどって思ったし、実際周りの友人残業やばい人いくらでも思い浮かぶし、
頑張って勉強して自分の成長に投資しないといけないですね。

頑張れ私ー!

今日の作業時間

30分+これからもう少しやります

今日の運動

エアロバイク1.5km+これからもう少しやります

PHPの==とか=って実際何してるんだろう【96日目】

演算子だってプログラム

何気なく書いてる+=ってありますが、これって何をしてるのでしょう。
プログラムによって仕様が違うわけで。

そこで先輩に教えていただいた言葉。
『“演算子“とは全てただの関数である』

あーなるほど、引数が2つあって、関数が動いてると考えると確かに・・・

ってことで先輩に問題出されました

"比較演算子"( <, >, ==, <=, >=)とはどのような関数でしょう?

"代入演算子"(=)とはどのような関数でしょう?

「◯◯をinputとし、◯◯をoutputする関数」って答えると良いよと言われたので、
php -aを駆使しながらいろいろ考えましたと。

これ、何気に難しかったです。

私の回答

"比較演算子"

a == b

aとbをinputとし、比較結果をbooleanでoutputする関数

"代入演算子"

$a = $b

[$aのアドレス]と$bをinputし、
[$aのアドレス]に$bを書き込み、
$aをoutputする

$aか$bかどっちを出力してるか調べるの大変だった。

代入演算子の回答を出すために使ったプログラム

$a = 0;
var_dump($a);
var_dump($b);
var_dump($a = $b);
var_dump($a);
var_dump($b);
var_dump($a = $a);
var_dump($a = $b = $c);

php -aで、エラーの出力、エラーが出ても実行する環境じゃないと再現出来ないかも。

実行結果は今手元にないので、明日の記事にしますね。

結論

何気なく使ってるものも意味がある。よく考察すると、理解が深まって、応用ができるようになるよ。

日記

勉強捗ってますね!いい感じにいろいろインプット出来てます!が!

vue、chart.jsが・・・苦戦・・・なんで動かないのこれ(´;ω;`)

ってことで、今日無理だったら明日以降友人に聞こうと思いましたまる。

運動

プログラミング

このあとやります。ただ予定あるので、30分プログラミングと1.5kmエアロバイクの予定。

時間ないからさくっと腹筋ローラーもやっておこう。

PHPとswiftの『switch』の挙動の違い【91日目】

switchのbreakって邪魔ですよね。

phpjavaのswitch文って、
基本的にbreak使ってcase内の内容だけを実行させるけど、
swiftはbreak要らないんだね!

あとkotlinはwhenって形式だとbreak要らないみたい!

同じ名前でも違う挙動するんだねー

ってことでコード

swift

num = 1;
switch num {
  case 1:
    print("1")
  case 2:
    print("2")
}

php

$num = 1;
switch($num) {
  case 1:
    echo 1;
    break;
  case 2:
    echo 2;
    break;
}

break使わない時のswitchの動きはどうするの?

break使わないように、まっすぐ下におろしたい時は、fallthroughって書くと良いらしい。

swift

num = 1;
switch num {
  case 1:
    print("1")
    fallthrough
  case 2:
    print("2")
    fallthrough
}

php

$num = 1;
switch($num) {
  case 1:
    echo 1;
  case 2:
    echo 2;
}

日記

私が、if, eldeif, elseifって書いていたら、
swift使いの人が、switchで書けば?ってお話してたら始まったお話。

PHPでswitch書く時は、==と同じ曖昧比較なので注意!

こんな感じに、普段使ってるコードってどういう意味なんだろう?ってちゃんと疑問に持つ大切。

最近読書が捗ってていい感じに勉強できてる(・∀・)

LaravelのsortByとorderByの使い所【84日目】

sortByとorderByの違いって?

sortBy()の使い所は、コレクションをソートする時に使います。
orderBy()where()とかと同じで、データベースから取得する時に使います。

使い方の違い

$query->get()->sortBy('id');
$query->orderBy('id')->get();

この2つの文がありますが、sortBy()get()してから使います。
まあ、コレクションに対してやるんだからそうよね。

orderByのいいところ

getは極力最後に使いたいので、

$query()->where('id', $id)->orderBy('created_at');

いろいろ書く
$query->get();

って書いた方が見やすかったり、処理わかりやすかったり、柔軟だったり

そもそも引数がコレクションのこともあるかもしれない

function (Collection $items) {
$items->sortBy('id');
}

引数がコレクションなら、そもそもsortByの方しか選択肢ないよねっていう。

同じことが出来るなら、正しい方を選ぶ癖つけよう。

getfirstとか、plucklistsとか。最終的に同じこと出来るなら、より短くてわかりやすいやつを選ぶ方が良いよね。

そのためにも、Laravelではどんなこと出来るんだっけっていうのを元のソースコードやドキュメント読んでちゃんと知っておかなきゃって思った1日でした。

日記

とうとうVSCodeを卒業して、IDEに手を出す日が来てしまいました・・・

ってことで、今後IntelliJを使う練習する予定です。

自分のPCにも、PHPStorm有料で買うのも視野。お金かけて何かを買うのは、
何かを始める動機、やらない理由を塞ぐことにも繋がるので、
自分への投資って大切。

こうやってブログ書くのも、PCを高い金で買って自分にプレッシャーかけたのがきっかけだし!

今日の運動

ごめんなさい、予定があって運動どれくらいやるか未定いいいいい

せ、せめてエアロバイク3.0kmはやる予定!

配列の中に配列が入っている時のforeach書き方2つ【83日目】

普通ならこうだし、これでも良いんだけど

foreach($array as $items) {
  echo 'first: ' . $items[0] . PHP_EOL;
  echo 'second: ' . $items[1] . PHP_EOL;
}

f:id:willow710kut:20180104223934p:plain

こんな書き方もあるよ

foreach($array as list($a, $b)) {
  echo 'first: ' . $a . PHP_EOL;
  echo 'second: ' . $b . PHP_EOL;
}

f:id:willow710kut:20180104223842p:plain

ちなみにlistの他の使い方

$func = function() { return array(0, 1, 2);};
list($a, $b, $c) = $func();

f:id:willow710kut:20180104223019p:plain

配列を解体して受け取ることが出来るみたい。

どっちが良い?

ってのが自分でもわからない。見栄えはどっちがいいかな。

順番に対して大きな意味とかあるのであれば、前者が良いかも?
ただ、それならキーを入れたい気もする。

どれがどういいかはまだわからないので意見ほしいかも。

日記

仕事始まりましたね。

やっぱり気分が違う。楽しい。けどやっぱり壁はいっぱいあるわけで。

そういや、同期と新規事業こんなの出来ないかなってお話してました。
まあ、似たのあるのはそうなんだけど、マネタイズとか、提供方法とか考えれば
どこかで差別化、優位性とか出せて住み分け出来るかもってお話してた。

どうやったら世の中のためになるのかなーとか。問題解決出来るのかなーみたいなことを
これからも考えるのをやめないでいたいですね。

今日の運動

腹筋ローラー5回(朝)
エアロバイク 3.0km(今から)

Laravelで『ページ3』や『次へ』や『前へ』というページネーションの作り方【77日目】

参考

ペジネーション 5.1 Laravel

手順

  1. ControllerでpaginateをつかってDBからデータ取得。
  2. Viewでrenderで呼び出す(renderは{!! !!}のカッコで囲むこと)

コード

    public function index()
    {
        $users = DB::table('users')->paginate(15);

        return view('user.index', ['users' => $users]);
    }
<div class="container">
    @foreach ($users as $user)
        {{ $user->name }}
    @endforeach
</div>

{!! $users->render() !!}

日記

朝早めの更新。というのも、昨日は早めに寝すぎて、早めに起きすぎた。ってことでもう半日過ごした気分なのです。

そういや、記事の質があんまりよろしくない点に関して、技術記事はリライト予定!
というのも、邪魔な日記があったりするしね。

今のところは忘備録って感じです。アウトプットすることで、自分の記憶に残りやすいし。
あと稀に知らなかった!役に立った!ってパターンもあるから、当たり前だと思っていることもアウトプットするの大切!