探検


PHP質問・雑談スレ3【初心者お断り(ROM歓迎)】©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
2017/02/13(月) 12:36:22.80ID:???
PHPに関する質問や雑談をするスレです。
初心者お断り(ROM歓迎)と書いてますが、初心者用のスレが用意されているからで、
難しい質問や話題をしなければいけないわけではありません。
PHPマニュアルの読み方を概ね理解していて、関数リファレンスが正しく読める方用のスレです。

PHP未導入の方や、手取り足取りが必要な初心者の方はム板のくだスレへどうぞ。
http://echo.2ch.net/tech/ (【PHP】で板内を検索)

前スレ
http://tamae.2ch.net/test/read.cgi/php/1476708252/

その他リンク
・PHPマニュアル
 https://secure.php.net/manual/ja/index.php
・コードテスト・貼り付け用
 http://ideone.com/
・プログラミングのお題スレ (求PHPer参戦)
 http://echo.2ch.net/test/read.cgi/tech/1480579110/

このスレで扱う話題
・PHPのコード,設定や設定値に関する質問
・常識的範囲内でのコードレビュー依頼・改良相談
・PECL,PEARに関する質問
・PHP新機能やPHP関連トレンドの話題
 (FWや非公式ライブラリの話題や特徴比較は良いが使い方から先の話題は専スレへ)
・PHPのバグ発見報告・公式に報告する前の検証依頼

このスレで扱わない話題
・直接関係ない○○特有の質問(専スレへ)
 (HH,エディタ,IDE,サーバ,OS,DB,SQL,FW,テンプレート,非公式ライブラリ・アプリケーション等)
・PHPの改造
2nobodyさん
垢版 |
2017/02/13(月) 18:35:45.04ID:33fWrUff
PHPって言語は誰が最初に開発したの?
2017/02/13(月) 19:37:40.02ID:???
ggrks
2017/02/15(水) 03:52:45.90ID:???
open_basedirが有効になってると
curl_setopt()のオプション CURLOPT_FOLLOWLOCATION が使えないんだけど
CURLOPT_FOLLOWLOCATIONはディレクトリ関係ないように思える、なんでこうなってんのですか

safe_modeはわからなくもないんだけどopen_basedirはさっぱりわからん
2017/02/16(木) 22:32:51.81ID:???
1 <?php
2 function a($var)
3 {
4 ($var === 1) or trigger_error("error", E_USER_ERROR);
5 }
6 a(2);

このコードなんですが、エラー発生箇所はline4ではなくline6にしたいのですが、
どうしたらいいですか?
2017/02/16(木) 22:54:00.54ID:???
スタックトレース見ようとか
2017/02/17(金) 15:53:59.28ID:???
例えばsession_save_path()関数はsession.save_pathディレクティブを変更出来る関数ですが、
そもそもsession.save_pathディレクティブはPHP_INI_ALLなので、
ini_setでいいわけで、わざわざ関数いらないんじゃ?って感じるのですが、
ini_setを使わずに標準関数で変更可能なものって、
わざわざ関数用意してるってことはそっち使った方がいいってことですか?
標準関数でなら変更可能だがini_setでは変更不可能なものとか存在するんでしょうか?
2017/02/17(金) 23:55:11.65ID:???
固定的・静的なものは、設定ファイルで、
変更されるもの・動的なものは、関数で

ユーザーがデフォルトのパスでよいなら、設定ファイルで、
別の場所へ保存したいのなら、関数で変えれば?
2017/02/18(土) 00:31:53.71ID:???
ini_set()もsession_save_path()も両方とも関数なのだが

ありえるのはセキュリティ上の理由などから
disable_functionsで広範に設定できるini_set()が禁止されてる、とかかね
あと返り値が違う
2017/02/18(土) 03:36:49.80ID:???
PHP: rfc:deprecate_ini_set_get_aliases
https://wiki.php.net/rfc/deprecate_ini_set_get_aliases

ini_setに一本化しようという提案もあるんだけどね
117
垢版 |
2017/02/18(土) 08:18:34.62ID:???
>>8-10
レスありがとうございます。
特に関数用意されてるからといって何かメリットがあるわけじゃなさそうって感じですね。
ただのエイリアスのようなら一本化には賛成ですね。なんかわかりづらいし。
ただ自分がユーザー側から開発側にまわって考えた場合、
あるAPI、オブジェクトに関連のある設定をまとめたページを作るのもいいですが、
よく変更されるものに関しては、関連関数に出しておくってのも親切設計かなと思いました。
ていうかPHPに日本人コントリビューターがいるとは驚きでした。
12nobodyさん
垢版 |
2017/02/18(土) 15:20:17.76ID:1y93Do+s
mysqli_real_escape_string()

どうして第一引数にlinkが必要になったの?
2017/02/18(土) 15:41:40.22ID:???
mysqlと違ってオブジェクト指向サポートしてるからだろ
$link->mysqli_real_escape_string($str)
これを手続き型にマッピングすると
mysqli_real_escape_string($link, $str)
になる
2017/02/18(土) 16:22:16.55ID:???
>>13
それはそうなんだけど、なんでオブジェクトが必要なん?
エスケープするだけだし、静的メソッドでも十分機能するよね

どうして性的じゃなくて普通のメソッドとして設計したんだろ
裏でDBに使っちゃいけない文字の問い合わせでもしてるん?
2017/02/18(土) 16:28:31.99ID:???
>接続の現在の文字セットを考慮して、SQL 文で使用する文字列の特殊文字をエスケープする
2017/02/18(土) 16:36:00.11ID:???
>>15
ありがとう

>接続の現在の文字セットを考慮
見落としていたわ〜 なるほど腑に落ちた これでなっとく森に帰れる
2017/02/18(土) 16:44:25.09ID:???
帰らないでもっと何かネタ持ってきて
2017/02/18(土) 17:29:15.64ID:???
静的メソッドっていつごろ実装されたんだっけ課

PHP4のときにはもうあった?
2017/02/19(日) 14:55:30.37ID:???
PHP認定とかあるじゃん
あれどれだけ有用なの?
2017/02/19(日) 23:12:13.00ID:???
7出たし5はいずれ下火になるかと
2017/02/19(日) 23:33:25.39ID:???
5.5や5.6で書いたソースが7で動かなくなるケースってある?
5系列当時でDEPRECATEDなのは使わずエラー抑制せずNOTICE出ないように書かれてると仮定で
2017/02/19(日) 23:43:45.99ID:???
>>21
http://php.net/manual/ja/migration70.incompatible.php
2017/02/20(月) 00:01:42.33ID:???
list()が結構大きい変更だろうな
2017/02/20(月) 00:16:09.20ID:???
listの変更って
格納先が配列、格納時に格納先に添字指定してる、格納先におけるこれら添字が未定義、
っていう条件のときに格納先をforeachしたりすると期待通りにならないかもってやつでしょ

限定的すぎないっつかこんなことしてるやついんの
2017/02/20(月) 00:21:02.14ID:???
・・・してた
2017/02/20(月) 18:47:32.15ID:???
>>24
申し訳ございません・・・ 申し訳・・・ございません・・・
2017/02/20(月) 19:22:18.70ID:???
listとか使いドコロがよーわからん
2017/02/20(月) 20:02:11.60ID:???
return array( $count, $data );
みたいな戻り値の関数からそれぞれ独立した変数で受け取れる
[0]とか['result']とか書くのだるいんじゃ
2017/02/20(月) 20:13:48.41ID:???
>>28
それだけの理由かYO
2017/02/20(月) 20:28:17.16ID:???
>>28
今はそのまま

$result = func()[0];

でいけるじゃろ
2017/02/20(月) 20:30:47.48ID:???
>>30
これがアウトになる時代がPHP7じゃなかったっけ?
2017/02/20(月) 20:38:38.18ID:???
>>30
それじゃだめだろ
$countと$dataそれぞれ2回分func()しなきゃいけない
2017/02/20(月) 20:46:33.16ID:???
>>31
そらどういった理由でアウトになるのか

>>32
2個ともいるならlistだけどそれよりもオブジェクトで返すわ
2017/02/21(火) 00:32:15.50ID:???
>>33
アウトにならないか
ごめん勘違いしてたわ
2017/02/21(火) 01:29:05.33ID:???
>>34
PHP5.3以前では一時変数必須, 5.4で可能になった構文だ
これが7, というか将来に渡って廃止されるならそれなりに理由が必要だわ
2017/02/21(火) 01:40:53.64ID:???
オブジェクトで返すってどう書いてんの
めんどくない?
2017/02/21(火) 01:57:05.79ID:???
>>36
そもそも>>28みたいな関数を書かないけど,

return new class ($count, $data) {
public $count;
public $data;
function __construct($count, $data)
{
$this->count = $count;
$this->data = $data;
}
}

で返すなり

$result = new class {
public $count;
public $data;
}

して値を操作してからreturn $result; するなり
2017/02/21(火) 02:01:27.55ID:???
<?php
class Hoge {
  public function __construct(array $a) {
    foreach ($a as $k => $v) {
      $this->$k = $v;
    }
    return $this;
  }
}
$hoge = new Hoge(["a"=>1,"b"=>2]);
echo $hoge->a;
echo $hoge->b;

publicにすりゃ楽勝じゃね
2017/02/21(火) 02:12:57.84ID:???
元々classとしてまとまってるclassが自身を返すとかならわかる
元々持ってるプロパティも関数もひとまとまりで渡せてそのまま使えるし
チェインも使えるんだし

戻り値のためにobject作って返すとか__construct()だけのclass定義するのって
普通の関数が配列返すのに比べてメリットあるの
2017/02/21(火) 02:17:46.34ID:???
どうでもいいがechoは複数の引数を取れる
echo $hoge->a, "\n", $hoge->b, "\n" ;
とか
2017/02/21(火) 02:25:12.89ID:???
なので echo $hoge->a . "\n" とするよりも高速だという話がなくもない
2017/02/21(火) 02:31:54.30ID:???
>>39
オブジェクトで返すってどう書いてんのの答えであって
短いコード書いただけだから

まああの形式ならキャストするだけでいいんだけどな

$hoge = (object)["a"=>1,"b"=>2];
echo $hoge->a;
echo $hoge->b;
2017/02/21(火) 02:32:07.35ID:???
>>39
ない

連想配列で返すよりは健全だと思うという程度
というか最小例だろうけど>>28の設計が良くない
2017/02/21(火) 02:42:39.83ID:???
解散
2017/02/21(火) 02:44:54.88ID:???
明日は19時に集合ね
2017/02/21(火) 02:54:25.06ID:???
20時にしとけよ
2017/02/21(火) 07:57:04.98ID:???
20時だぞ
2017/02/21(火) 19:59:44.94ID:???
echoするとベンチ取りにくいから実証が難しい件
2017/02/21(火) 23:30:45.12ID:???
そんなechoしないし・・・・
2017/02/22(水) 00:15:53.83ID:???
echo するとベンチ取りにくいってどういう意味で言ってるんだろう
2017/02/22(水) 00:27:53.73ID:???
echo "111";とecho "1"."1"."1";がほぼ同じ

echo "1","1","1";とecho "1"; echo "1"; echo "1";がほぼ同じ

早いのは当然前者
2017/02/22(水) 01:27:46.61ID:???
アウトプットがボトルネックになってる疑いがあってそれを計りたいのかな
53nobodyさん
垢版 |
2017/02/22(水) 04:43:19.89ID:EO117d6L
プレミア見れない
ブンデス見れない
CLEL見れない
週刊誌でヌケねえちきしょう
同和のクズ共死ねクソ共がざまあみろ気違い共
ほれ気違い共もっともっとドア閉めろ通れ
それしか能のない能無し共がざまあみろ地獄に落ちろ
2017/02/23(木) 18:01:21.99ID:???
フレームワークのソースとか見てると型宣言でarrayはよく使われてるけど
intやstringが使われていない理由ってあるの?

function (int $id, string $name)
function (array $ids)
2017/02/23(木) 18:25:33.57ID:???
arrayかどうかの違いが一番めんどくさいから縛っただけじゃないの
2017/02/23(木) 18:37:56.03ID:???
引数不定やarrayに関する処理だからでは?
int使うべき場所でarray使ってるなら見てみたい
2017/02/23(木) 18:44:27.25ID:???
使う使わない以前にスカラータイプヒンティングは7じゃないと使えないから
58nobodyさん
垢版 |
2017/02/23(木) 22:24:17.96ID:eDjRjXi2
PHPのバージョンがたまーにアップグレードしますが
これって誰が言語を改造してるの?
2017/02/24(金) 00:30:13.92ID:???
PHPはオープンソースだから誰ってのはない
github上で開発されてて誰でもフォークできる

次期PHPに取り入れるかは
誰かが提案を持ってきて議論して取り入れるか投票して決めていく
提案は誰でもできるが投票はそれなりの実績がある人でないと出来ない
2017/02/24(金) 00:30:24.88ID:???
>>58
おまえはマトマな会話が出来るようになるまで最低3年ROMれ
2017/02/24(金) 00:51:55.60ID:???
>>58
はい
ttp://people.php.net/
2017/02/24(金) 15:35:28.17ID:???
google sha1攻撃に成功

$srcA = file_get_contents("https://shattered.it/static/shattered-1.pdf";);
$srcB = file_get_contents("https://shattered.it/static/shattered-2.pdf";);
echo sha1($srcA)."\n".sha1($srcB);
2017/02/24(金) 15:58:53.10ID:???
サーバ証明書みたいな固定で攻撃されやすいものは今はもうだいたいSHA256以上になってるし
パスワードのハッシュにsha1()を1回使うだけなシステムもそうそう無いんじゃない?
2017/02/24(金) 20:54:51.82ID:???
DBのパスワードsha1だよ
なるべく短いかつ強力なハッシュアルゴリズムってどれ?
2017/02/24(金) 21:05:42.49ID:???
password_hash()
2017/02/24(金) 21:31:04.59ID:???
password_hashって、より安全なアルゴリズムに変わる可能性があるから、
長めの領域とっておけみたいなこと書いてて、
アルゴリズム変わっても同じシステムで使うこと想定してるようだけど、
過去に使用してたアルゴリズムでパスワードの比較ができるの?
今のアルゴリズムで一致しなかったら前のバージョンで使用してたのと比較ってのを、
変更した回数だけ繰り返してるようなら、パスワード間違ってたら比較回数増えるし、
別のハッシュアルゴリズムと衝突することがあるのか知らないけど、
衝突することがあるならその危険性が増えそう。
2017/02/24(金) 21:35:41.63ID:???
>>66
ドキュメント読もうぜ
2017/02/24(金) 21:42:36.64ID:???
マニュアル読むのめんどくさければ変わりに解説するか
「うだうだ言わずにpassword_hash()使え」
2017/02/24(金) 21:57:07.62ID:???
なるほど
返り値に含まれてるのか
2017/02/24(金) 22:03:11.95ID:???
>>68
理由もなくとりあえず使っとけみたいな初心者脳のは半年ROMっとけ
2017/02/24(金) 22:10:22.84ID:???
>>70
理由?ほい
http://php.net/manual/ja/faq.passwords.php
2017/02/24(金) 22:56:22.54ID:???
良くわからんのだけど
googleが実験したってやつは要するにsha1()にかけたときに
正当なパスワードと同じ結果を生む文字列の探索でしょ
sha1()は160bitだからまだ同じ結果になるものを探索できたということ
正当なパスワードが漏れるんじゃなくて、不正ログインできちゃう別のパスワードが出てくるということ

この攻撃がWebサーバのphpを通して通用するなんてとても考え難い
正解のsha1()が漏れてる想定になるんだから他のデータも漏れてる想定が妥当
そのうえ、単純にパスワード文字列に1回sha1()かけただけの場合の別パスワードの解析ですら超長時間が必要

限定的過ぎてとても現実的な脅威に思えないんだが、こういう理解で合ってる?
2017/02/24(金) 22:59:51.75ID:???
むしろサーバ環境からアルゴリズムが推測されうるpassword_hash()よりも
sha1($password).sha1('foo'.$password.'bar') とか適当にやっとくほうが良いのでは
2017/02/24(金) 23:32:07.69ID:???
>>72
強衝突耐性突破の実証
直ちに問題となるのはファイルのダイジェストなど

しかしそもそもSHA-1にせよSHA-2にせよ1回実行するだけでは高速過ぎる
またレインボーテーブルがあれば逆算の計算量は対数オーダーに減少する
これらの理由からSHA-1やSHA-2を1回実施するだけという処理はパスワードハッシュに向かない

password_hashは計算コストを指定出来るから>>73みたいなことを考えるくらいなら素直に使っとけ
2017/02/24(金) 23:55:47.17ID:???
>>74
認証時の計算コストが上がれば耐久性は高まっても同時にサーバ負荷も高まる
そもそも何をもって高速過ぎると?
zdnetの記事(//japan.zdnet.com/article/35097102/)ではこう書かれているが

>この手法では、実際に同じハッシュ値を計算するのに要する計算量が、
>第1段階の攻撃に6500基のCPU、第2段階の攻撃に110基のGPUを使用して
>1 年間で実行できる量に相当するという。

総当りに比べ非常に高速化されたsha1()の1回計算ですら
こんなにリソースを要するということだが、これがそんなに危険なのか俺にはよくわからん

ニュースを見ればSHA-1が破られただのSHA-1は危険だのと書きたてられているが
実際に例えばphp.net/downloads.phpに一覧されてるファイルが書き換えられるとして(実際にはSHA256だが)
ファイル置き換え可能なら横のハッシュ表示も書き換え可能ではないか
ファイルサイズまで同一、md5まで同一、とやれば加速度的に処理時間は増えるだろうし
2017/02/24(金) 23:59:54.08ID:???
>>75
数年前にMD5で同じこと言ってそうだな

ファイルのダイジェストはすまん, それより公開鍵認証の証明書のフィンガープリントの方が問題だな
MITM攻撃
2017/02/25(土) 00:08:16.10ID:???
>>76
すまんけどmd5は知らん
サーバ証明書ならわかる。長けりゃ年単位だし
実は63でも書いたけど事実ほとんどはSHA256以上になってるしSHA1は取り扱い停止してるし

ただファイルについては「不正なファイルを正規のファイルとうんたらかんたら」って論調が
前述の通りニュースで散見される、正直意味わからん
パスワード管理についても現実性を考えると正直微妙すぎるとしか思えなくてなあ
2017/02/25(土) 00:42:35.16ID:???
>>77
ファイルとダイジェストが同じサーバで配信されるとは限らん
というか別の経路で(も)配信せにゃ無意味

>>75にももう少し言及しておくけど
> 認証時の計算コストが上がれば耐久性は高まっても同時にサーバ負荷も高まる
その通り, 反復試行出来る回数が激減する
レインボーテーブルの生成も困難になる
パスワードのハッシュ生成なんて反復実行しないんだから速くていいことなんて何もない

> そもそも何をもって高速過ぎると?
暗号論的ハッシュ関数は実行速度も重視して設計されてるけどパスワードハッシュの生成には必要ない
2017/02/25(土) 00:51:15.15ID:???
この手の話は最終的に早すぎる早すぎない・負荷問題になる負荷問題にならないの水掛け論になる運命

というか悩むヒマあるならsha1はそのままでいいから
SQLインジェクションやCSRFが成立しないか
信用できない値をそのまま使ってないかガリガリ調べるほうが有意義
2017/02/25(土) 16:08:37.48ID:???
$this->func(
$arg1,
$arg2,
$arg3
);

$this->func($arg1,
$arg2,
$arg3
);

引数を改行する場合はどっちがキレイだと思う?
2017/02/25(土) 16:26:54.47ID:???
どっちか選択しかないなら読み間違えがなく揃ってる前者
2017/02/25(土) 20:29:44.48ID:???
PSR-2だと上のほうだけど長くなるならそうしろって書いてるけどその書き方好きじゃねえ
自分は無名関数渡すまでは改行しない
file_get_contentsのreturnのような文字数的な意味で長くなるなら変数に入れてから渡すなり
数的な意味で長くなるなら配列使ってそっちで改行するかな
http://php.net/manual/ja/function.imagecopyresampled.php
この程度は許容範囲
2017/02/25(土) 20:45:34.81ID:???
引数では改行しないけど、大抵array()に入れてから渡すからなー
array()の引数では改行してるわ

改行してたわ!!!
2017/02/25(土) 20:50:13.10ID:???
array()の場合は最後の値直後にカンマ書けるから並べて書いた方がしっくりくる

引数は最後にカンマ書けないから、最後の値と同じ行に閉じカッコまで書く
2017/02/25(土) 21:02:05.33ID:???
あーたしかにそうだな
よく考えずに使い分けてたわ、ありがとう
2017/02/25(土) 21:13:17.17ID:???
>array()の場合は最後の値直後にカンマ書ける
そうだったっけ?syntaxエラーならなかったっけ?
俺の思い違いじゃなければPHPはだめだったような
2017/02/25(土) 21:19:12.19ID:???
>>86
今試したけどいけるよ。
array(1,2,3,);
2017/02/25(土) 21:34:36.93ID:???
ほんとだ出来るわ
json_encodeと勘違いしてたみたい
2017/02/25(土) 21:49:02.80ID:???
関数と言語構造の違いだな

ってか、ここ初心者ROMスレだが。。
2017/02/25(土) 21:50:24.86ID:???
コーディングスタイルなんてどうでもいい質問もよく出るなここ
2017/02/25(土) 22:11:00.93ID:???
>>80
どっちもアホみたい

そういう風に改行する可能性があるのは呼び出される関数定義側の話で
呼び出し側は基本的には1行で書くにきまってんだろ
2017/02/25(土) 22:18:18.71ID:???
>>83
石器人さん、ちーす
オブジェクト指向、いいかげん覚えような

連想配列渡しとオブジェクト渡し、決定的に違う事があるからさ
そろそろ、原人やめようぜ
2017/02/25(土) 22:19:47.70ID:???
> 76 : nobodyさん2017/02/24(金) 23:59:54.08 ID:???
> >>75
> 数年前にMD5で同じこと言ってそうだな


ぐぐれかす
2017/02/25(土) 22:21:39.85ID:???
> 79 : nobodyさん2017/02/25(土) 00:51:15.15 ID:???
> この手の話は最終的に早すぎる早すぎない・負荷問題になる負荷問題にならないの水掛け論になる運命

> というか悩むヒマあるならsha1はそのままでいいから
> SQLインジェクションやCSRFが成立しないか
> 信用できない値をそのまま使ってないかガリガリ調べるほうが有意義


どういう理屈で前後の文がつながるのかわからん
ノータリンはすげーな、相変わらず

理論が破綻しとる
2017/02/25(土) 22:41:41.56ID:???
>>91
完全に失念してたわ
呼び出す方か
ねーわwww
2017/02/25(土) 23:18:11.38ID:???
>>92
具体的に何が違うん
2017/02/25(土) 23:27:02.59ID:???
>>91
どこの常識だよ
少なくともPSR-2はこう規定している

>4.6. メソッド及び関数の呼び出し
>引数リストは、インデントにより揃えることで、複数行に分割しても構いません。
>その際、最初の定義も次の行からはじめるものとし、1行に1つの引数を定義しなければなりません。
>
><?php
>$foo->bar(
>  $longArgument,
>  $longerArgument,
>  $muchLongerArgument
>);

なんでも1行でまとめるほうが美しいとか勘違いしてる能無しはたまにいるな
2017/02/25(土) 23:29:08.62ID:???
>>97
構いませんって書いてるだけで別に推奨はしていない
2017/02/25(土) 23:36:05.92ID:???
>>98
複数行で書いて当然なんて誰も書いてないよw
100nobodyさん
垢版 |
2017/02/26(日) 00:05:12.08ID:???
>>94
それは程度問題と致命的欠陥の差ということだよ
内部データとしてのパスワードの保護はデータを盗まれた後の話なので
データを盗む手段となるSQLインジェクション等の脆弱性調査を優先すべきという意味もある
101nobodyさん
垢版 |
2017/02/26(日) 01:28:18.36ID:???
関数定義側で改行するのも別に推奨されることじゃないでしょ
むしろしないわ
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況