2ちゃんねる スマホ用 ■掲示板に戻る■ 全部 1- 最新50    

■ このスレッドは過去ログ倉庫に格納されています

【PHP】下らねぇ質問はここに 9

1 :デフォルトの名無しさん :2017/12/20(水) 18:00:20.28 ID:1xaO/YRR0.net
PHPに関する質問スレです

前スレ
【PHP】下らねぇ質問はここに書き込みやがれ 8
http://mevius.5ch.net/test/read.cgi/tech/1489506082/

次スレは>>980以降
本文の1行目に以下を追加すること
!extend:on:vvvvv:1000:512
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured

955 :デフォルトの名無しさん :2018/11/09(金) 10:27:43.53 ID:gcFuq4sF0.net
Fortranは?

956 :デフォルトの名無しさん :2018/11/09(金) 13:22:28.59 ID:aQf6YGTQ0.net
すみません、よろしくお願いします。

function readLines(string $path){
$i=0;
$file=fopen($path,'rb') or die('ファイルが見つかりません');
while($line=fgets($file,1024)){
yield $line;
}
fclose($file);
}

$gen=readLines('sample.txt');//***
foreach($gen as $line){
print $line.'<br>';
}
?>
読みだす対象ファイルは10行あります。

***の部分なのですが、$genで関数readLine()を1度呼び出して
対象ファイルから一行読みだしているように思えるのですが、
実際には、対象ファイルの全行を読みだしています。
$genで全行(10行)格納できているのは、どんな働きがあってのことなのでしょうか?

957 :デフォルトの名無しさん :2018/11/09(金) 13:34:20.06 ID:TMuJweZBa.net
コピペプログラミングの典型的パターン

958 :デフォルトの名無しさん :2018/11/09(金) 13:47:18.90 ID:sRuc/yNP0.net
>>956
たった8行しかない関数なんだから
自分で1行ごとに何しているかを調べてみよう

959 :デフォルトの名無しさん :2018/11/09(金) 14:03:26.71 ID:lA/zS5Cl0.net
>>956
while ($line=fgets($file,1024)) { }
がループ処理だって事も分からないのはやばいぞ
もう少し頑張れw

このコードはだめだな
while($line=fgets($file,1024))
これだと 0 だけとか改行だけの行があったらそこで処理が止まる

同じように書くなら
while (($line = fgets($file, 1024)) !== false) { }
こう書かないと駄目

PHPerはよく if ($hoge = fuge()) みたいな書き方をするけど
分かってる上で手抜きでそう書くなら別にいいが
分かってないならそんな書き方はやめるべき

960 :デフォルトの名無しさん :2018/11/09(金) 14:08:17.39 ID:9S1HIFQT0.net
ジェネレータ使ってるから一見何してるか分かりにくいように見えるかもね
とはいえ便利だし1行ずつ読めば難しくない

ifの条件文中で代入するのはむしろCでよく見た

961 :デフォルトの名無しさん :2018/11/09(金) 15:26:07.95 ID:aQf6YGTQ0.net
ありがとうございました。

962 :デフォルトの名無しさん :2018/11/09(金) 15:37:24.13 ID:lA/zS5Cl0.net
>>960
swiftとかpythonだとこういう書き方はできないからね(代入式が値を返さない)
そのおかげでヨーダ記法みたいなヘンテコリンな書き方をしなくてもミスが防げるんだけど
一長一短だしこの書き方を全否定してるわけじゃないってことで

perlのワンライナーが気持ちいいってのもよく分かるが
人が書いたものは見たくないというのもよく分かるw

963 :デフォルトの名無しさん :2018/11/09(金) 15:42:44.74 ID:lA/zS5Cl0.net
すまん下の2行
全然関係ない文章が入ってしまった

書こうと思って削除した文章がクリップボード履歴からコピペされてしまった

964 :デフォルトの名無しさん :2018/11/09(金) 16:57:09.09 ID:gcFuq4sF0.net
分かる

心の叫びだろうw

965 :デフォルトの名無しさん :2018/11/09(金) 16:59:43.84 ID:aAkZVDrn0.net
PHPは大っ嫌いだけどLaravelは好き

966 :デフォルトの名無しさん :2018/11/09(金) 17:13:56.97 ID:aAkZVDrn0.net
セミコロン消えろ

967 :デフォルトの名無しさん :2018/11/09(金) 18:45:22.74 ID:lA/zS5Cl0.net
なぜ文字列結合を . にしちゃったんだろう
フレームワークを通さずにドットチェーンでサクッと書きたい時に悲しくなっちゃう

968 :デフォルトの名無しさん :2018/11/09(金) 18:52:30.49 ID:gcFuq4sF0.net
そういうしきたりがあったから

969 :デフォルトの名無しさん :2018/11/09(金) 19:48:04.81 ID:3iCSUlan0.net
>>956
$gen=readLine('sample,text'); は、$genに関数を入れてるだけで、
書き換えるのなら

foreach(readLine('sample.text') as $line){
 print $line'.<br>';
}
ということでは?

970 :デフォルトの名無しさん :2018/11/10(土) 13:09:23.21 ID:w8ozGR5u0.net
>>969
ありがとうございます。変数に関数を入れられるのですね。
書き換えられた方はテキストの別のページに載ってるのと似ているので理解できました。
すっきりしました。ありがとうございました。

971 :デフォルトの名無しさん :2018/11/10(土) 17:34:15.93 ID:KJE8CLNB0.net
>>970
別の人も書いてるけどジェネレーター(yield)を使ってて分かりにくいなら
yield使わずに同じことやってみたらいいかも

972 :デフォルトの名無しさん :2018/11/10(土) 17:57:23.60 ID:w8ozGR5u0.net
>>971
ありがとうございます。
各yieldの前後や、関数の呼び出し元に
print文でどこを実行しているのかを表示させるようにして確認しました。
yield fromを混ぜ込んだ文も、同様に処理するようにしたら
ずいぶん理解できるようになりました。

皆様、ありがとうございます。

973 :デフォルトの名無しさん :2018/11/10(土) 22:20:51.20 ID:16GnFLu/0.net
$gen=readLine('sample,text'); 
これで代入されてるのは関数じゃなくてジェネレータ関数が返す反復可能なオブジェクト(への参照)かな
ジェネレーター関数を呼び出したのをvar_dumpするとこんな感じだわ
object(Generator)#1 (0) {}

974 :デフォルトの名無しさん :2018/11/11(日) 16:39:55.95 ID:kuiXddTN0.net
Laravelのログイン処理をゼロから解説してる学習リソースありますか?

975 :デフォルトの名無しさん :2018/11/12(月) 01:02:22.66 ID:FJ/7DuU50.net
青い本とオレンジ色の本
Amazonで探せばすぐにわかる

976 :デフォルトの名無しさん :2018/11/12(月) 01:05:34.03 ID:FJ/7DuU50.net
あとはLaravel公式リファレンス
https://readouble.com/laravel/5.7/ja/authentication.html

977 :デフォルトの名無しさん :2018/11/17(土) 20:03:24.34 ID:yvB12Mei0.net
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10199147355
Laravelで糞以下の質問をしている奴を見つけた。

978 :デフォルトの名無しさん :2018/11/17(土) 23:01:03.89 ID:2QpS/L3VM.net
>>977
こんな性格じゃそりゃいつまで経ってもゴミのままだわな

979 :デフォルトの名無しさん :2018/11/18(日) 00:24:19.00 ID:lxV5KuwV0.net
>>978
ソースも性格もゴミ
そしてその質問者のTwitter
https://twitter.com/tekitouk
(deleted an unsolicited ad)

980 :デフォルトの名無しさん :2018/11/24(土) 16:02:54.40 ID:iAypOYs00.net
よろしくお願いします。

for($i=1;print"{$i}<br>",$i<6;$i++);
for($i=1;$i<6,print"{$i}<br>";$i++);

前者は、1〜6までをプリントしますが、後者は無限にプリントされてしまいます。i++が6を超えてしまうのはなぜなのでしょうか?

981 :デフォルトの名無しさん :2018/11/24(土) 16:33:47.44 ID:ue64utAZ0.net
>>980
http://php.net/manual/ja/control-structures.for.php

982 :デフォルトの名無しさん :2018/11/24(土) 17:52:32.26 ID:cnsZLZxi0.net
こんなコード書かれたら頭痛いンゴ

983 :デフォルトの名無しさん :2018/11/24(土) 18:03:15.60 ID:+h/hylzW0.net
https://github.com/php/php-src/blob/master/Zend/zend_compile.c#L4597
https://github.com/php/php-src/blob/master/Zend/zend_compile.c#L4575

zend_compile_expr_listを見る限りexprの並びは最終評価値が返る
そもそも>>980のコードは書いたやつ殴るレベルだが

984 :デフォルトの名無しさん :2018/11/25(日) 09:04:25.92 ID:dabdOdKd0.net
>>981
ありがとうございます。
判定がtrueになり続けてしまうということなのですね。

もう一つ質問があります。

class A{
private $B;

public function __construcr($C){
$this->B=$C;
}

というコードなのですが、classAのフィールドで変数$Bを宣言して
関数のコンストラクタの$thisで、変数$Bに引数を代入してますが
この時、変数Bの$が取れているのはどういう仕様なのでしょうか?

985 :デフォルトの名無しさん :2018/11/25(日) 09:17:54.45 ID:43hAniU60.net
$が取れていることで可変関数を使える仕様になっている

986 :デフォルトの名無しさん :2018/11/26(月) 15:12:38.13 ID:aqdzSIAP0.net
>>985
ありがとうございます。
可変関数は、$変数に関数名を格納して使うものだと理解していました。
もう少し、可変関数に関して調べてみます。

987 :デフォルトの名無しさん :2018/11/26(月) 18:28:25.99 ID:vghby52J0.net
$db=getDb();
$opDB=$db->prepare('SELECT * FROM sample WHERE id=?');
$opDB->bindValue(1,$_GET['id'] ?:1);

このコードから質問お願いします。
2行目の id=? は、ワイルドカードのようなものですか?
3行目のbindValueの一つ目のパラメータの1は、何を指しているのでしょうか?

988 :デフォルトの名無しさん :2018/11/26(月) 18:34:58.26 ID:9UWiUoMZ0.net
一つ目:イイエ
二つ目:一つ目の?

989 :デフォルトの名無しさん :2018/11/27(火) 09:20:32.54 ID:bFvRPa1H0.net
返答ありがとうございます。

id=? っていうのは、どういう働きをするコードなのでしょう
一つ目とか、bindValue(1,$_GET['id']);の、'1'です

990 :デフォルトの名無しさん :2018/11/27(火) 14:57:55.52 ID:aBLKPQ100.net
>>987
>>989
SELECT * FROM sample WHERE id=?
というSQLの中で使われている「?」はプリペアドステートメントというもの
http://php.net/manual/ja/pdo.prepared-statements.php

?だと理解し難いなら名前付き(例えば今回なら :id とか)にした方が理解しやすいと思う


$hoge = $_GET['id'] ?: 1;

はエルビス演算子という三項演算子を省略した書き方
可読性が悪いのであんまり使わない方が良いと思う

・同じ事を三項演算子で書くなら
$hoge = ($_GET['id']) ? $_GET['id'] : 1;

・同じ事をif文で書くなら
if ($_GET['id']) {
  $hoge = $_GET['id'];
} else {
  $hoge = 1;
}

だが、このケースでは、こんな書き方をしてはいけない。
(続く)

991 :デフォルトの名無しさん :2018/11/27(火) 14:59:13.82 ID:aBLKPQ100.net
(続き)
$_GET['id']が定義されていない事を考慮した正しい書き方は

・PHP7以降ならNULL合体演算子を使って
$hoge = $_GET['id'] ?? 1;

・↑が分かり難いなら
$hoge = (isset($_GET['id'])) ? $_GET['id'] : 1;

・↑でも分かり難いなら
if (isset($_GET['id'])) {
$hoge = $_GET['id'];
} else {
$hoge = 1;
}

このケースでエルビス演算子をこんな使い方するような糞コードは、あんまり参考にしない方がいい

992 :デフォルトの名無しさん :2018/11/27(火) 15:06:26.62 ID:aBLKPQ100.net
>>980も読んだが、エルビス演算子の使い方といい
いったい何を参考にしてこんなコードを書いてるんだろうか

もし本を参考にしてるなら焼き捨てた方がいいレベルで酷い

クイズ的に質問してるなら面白いけどw

993 :デフォルトの名無しさん :2018/11/27(火) 16:49:32.78 ID:BR30Kh7X0.net
演算子の説明だけだとシンプルで理解しやすいけど実用性ではクソ
実用性重視の説明だと本来説明したいもの以外の説明で蛇足だらけで
紙面使いすぎでクソ
というジレンマなんやろ

994 :デフォルトの名無しさん :2018/11/27(火) 18:08:09.22 ID:MA03kwvb0.net
$input = trim(fgets(STDIN));
while($input)

echo $input;

これってwhileの式のところでは$inputの中が空かって判断してるの?そういう機能がついてるのか?

995 :デフォルトの名無しさん :2018/11/27(火) 18:52:40.99 ID:DSo9/Qg/0.net
>>987
SELECT * FROM sample WHERE id=?

id=? は、placement。
? の所に、値が入る

SQL injection 対策

例えば、単純な文字列をつなげて、問い合わせると、
? が「1; DROP TABLE 何々」とか、クラッカーに入力されると、

「SELECT * FROM sample WHERE id=1; DROP TABLE 何々」のように、
; で、危険なSQL文をつなげてくる

placement で、SQL文をつなげられないようにしている

996 :デフォルトの名無しさん :2018/11/27(火) 19:01:55.97 ID:aBLKPQ100.net
>>994
そのコードだと、trim(fgets(STDIN))の値が (bool) true であった場合に永久ループになるw

実際は

while ($input = trim(fgets(STDIN))) {
echo $input;


こう書くべき処理なのでは?

997 :デフォルトの名無しさん :2018/11/27(火) 19:53:06.64 ID:MA03kwvb0.net
while分の中では$inputをbool型にして判定してるわけか?

998 :デフォルトの名無しさん :2018/11/27(火) 22:02:27.91 ID:7ygBETe/0.net
空文字がFalse判定されることを利用して
空行入力で終わるようにしてるんだろうけど
ゼロとかもFalse判定されて終わっちゃうんじゃないか
試してないけど

999 :デフォルトの名無しさん :2018/11/28(水) 12:01:30.07 ID:eIHsuPDh0.net
Ruby では、nil, false の偽が2つだけ。
一方、JavaScript, Python, PHP などは、偽が10個ぐらいあるから、超危険!

基本的に、Ruby 以外は、バグってどうしようもない

1000 :デフォルトの名無しさん :2018/11/28(水) 12:52:07.66 ID:yr9LfNgh0.net
>>990
ありがとうございました。プレイスホルダなのですね。
prepareでSQLを用いて、プレイスホルダを使うとき、
SQL文の中で、左から数えたプレイスホルダの順番を、
bindValueのカッコ内の数値で指定してバインドする、ということもわかりました。
?:や??:の解説もありがとうございました。

>>992
独習phpというテキストを使っています。

>>995
ありがとうございます。
prepareステートメントが悪意ある入力に対策しているとテキストにも書いてありました。

皆様、ありがとうとざいました。
今のテキストを読み終えたら、もう少しテキストを吟味して、違うテキストを探してみようと思います。

1001 :デフォルトの名無しさん :2018/11/28(水) 15:13:42.98 ID:zpzfEtE+0.net
>>997
そういう事

ただ>>998,999の言う通りなので
while (($input = trim(fgets(STDIN))) !== false) {
echo $input;
}

こう書くのが正しい

(なんか前にも似たような事を書いた気がするw)

1002 :デフォルトの名無しさん :2018/11/28(水) 15:17:38.93 ID:zpzfEtE+0.net
すまんw 大嘘書いたww
>>1001のコードだと trim() によって string型にキャストされるから永久ループするわwww

while (($input = fgets(STDIN)) !== false) {
echo $input;
}

が正しいが場合によっては

while (($input = trim(fgets(STDIN))) !== '') {
echo $input;
}

が期待した動作なのかもしれない

1003 :デフォルトの名無しさん :2018/11/28(水) 17:09:43.57 ID:Nb5yTkdM0.net
次スレ

【PHP】下らねぇ質問はここに書き込みやがれ 10
http://mevius.5ch.net/test/read.cgi/tech/1543392526/

1004 :2ch.net投稿限界:Over 1000 Thread
2ch.netからのレス数が1000に到達しました。

総レス数 1004
345 KB
掲示板に戻る 全部 前100 次100 最新50
read.cgi ver 2014.07.20.01.SC 2014/07/20 D ★