トップページ⇒php
1002コメント311KB

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

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

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

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

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

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

このスレで扱わない話題
・直接関係ない○○特有の質問(専スレへ)
 (HH,エディタ,IDE,サーバ,OS,DB,SQL,FW,テンプレート,非公式ライブラリ・アプリケーション等)
・PHPの改造
0385nobodyさん2016/11/15(火) 13:21:22.86ID:???
$stmt = $db->query('SELECT * FROM users');
$users = $stmt->fetchAll(PDO::FETCH_CLASS, 'User');
のUserクラスにも、setter, getterを定義するの?
0386nobodyさん2016/11/15(火) 13:28:22.94ID:???
外部からデータを隠蔽してgetter/setterをつけときゃカプセル化でしょ的な理解レベルの奴多そう
0387nobodyさん2016/11/15(火) 13:35:20.10ID:???
>>383
誰もそんなこと一言もいってないからな
0388nobodyさん2016/11/15(火) 13:55:25.19ID:???
>>387
お前の考えた最強OOPの話は、お前のブログでやってくれよ
0389nobodyさん2016/11/15(火) 14:32:40.91ID:???
会話出来ない人はツイッターへどうぞ
0390nobodyさん2016/11/15(火) 14:33:21.93ID:???
カプセル化については、ここの説明がわかりやすい
https://www.ogis-ri.co.jp/otc/hiroba/technical/concept.html
0391nobodyさん2016/11/15(火) 14:55:04.23ID:???
>>387=388
>>383はアホだからほっとけ

>>385
定義すれば型矯正ができるが、PHP様にはマジックメソッドというものがあるので
明示的にgetter/setterは作らない
0392nobodyさん2016/11/15(火) 14:56:00.40ID:???
>>387
>>383=388 はアホだからほっとけ

の間違い
0393nobodyさん2016/11/15(火) 15:07:35.55ID:???
>>391
マジックメソッド?
0394nobodyさん2016/11/15(火) 15:09:20.45ID:???
__get()
__set()
0395nobodyさん2016/11/15(火) 15:16:57.08ID:???
>>394
それを使ったらpublicプロパティを使うのと同じだから、カプセル化に反するのでは?
0396nobodyさん2016/11/15(火) 15:24:09.65ID:???
これが正解だと思うんだがどうだろう

https://twitter.com/s_osa_/status/515312406084345856?ref_src=twsrc%5Etfw
「外部に公開するインターフェイスを決定して、そのために必要な変数をプライベートで保持する」っていう感じ。
インターフェイスが先に来ることがわかっていれば>>395のように混乱することはない
0397nobodyさん2016/11/15(火) 15:33:38.65ID:???
>>396
別に混乱してないと思うが。

>>394は、
class User {}
と定義して
$users = $stmt->fetchAll(PDO::FETCH_CLASS, 'User');
を実行するという意味だと思うが、それだと
class User {
  public $user_id;
  public $name;
  public ...
}
と同じ事になり、カプセル化に反するのでは?という疑問。
0398nobodyさん2016/11/15(火) 15:56:55.53ID:???
つか、__get()/__set()をどう使うんだ?
0399nobodyさん2016/11/15(火) 16:08:24.97ID:???
public と public じゃないもの
については多弁なんだな
0400nobodyさん2016/11/15(火) 16:24:04.42ID:???
>>395
だから、カプセル化とかいう幻想は捨てろ。
ニーズに合った設計しろ。
0401nobodyさん2016/11/15(火) 16:24:24.30ID:???
>>391
カプセル化とかどうでもいい
>>391がどう__get/__setを使ってるのかだけ知りたい
0402nobodyさん2016/11/15(火) 16:24:46.42ID:???
>>398
冗談抜きで聞いてるの?
0403nobodyさん2016/11/15(火) 16:25:40.72ID:???
>>400
と、何かを主張したかのようなコメントを垂れ流すのに何か意味はあるのか?
0404nobodyさん2016/11/15(火) 16:26:42.62ID:???
>>402
マジですが・・・
0405nobodyさん2016/11/15(火) 16:27:01.81ID:???
>>403
何にも主張していない、お前がアホだと呆れているだけだ。
それ以上、何を望む?
0406nobodyさん2016/11/15(火) 16:28:38.53ID:???
いや、さすがにこの流れで「カプセル化とかいう幻想は捨てろ」はない
0407nobodyさん2016/11/15(火) 16:37:12.33ID:???
カプセル化って幻想だったんだ
0408nobodyさん2016/11/15(火) 16:42:27.27ID:???
>>406
なんでねーんだよ、なんでもかんでも隠蔽するべきじゃないって流れだろ?
0409nobodyさん2016/11/15(火) 16:43:40.25ID:???
>>379がアホ
>>381が正しい
0410nobodyさん2016/11/15(火) 16:45:53.53ID:???
>>404
しょうがねぇな、では、真面目に答える。
なんかうまく書き込みできねーから2回に分けてみるが、うまくいくかどうか。


> 385 : nobodyさん2016/11/15(火) 13:21:22.86 ID:???
> $stmt = $db->query('SELECT * FROM users');
> $users = $stmt->fetchAll(PDO::FETCH_CLASS, 'User');
> のUserクラスにも、setter, getterを定義するの?

>>385の流れの質問だったよな。

例えば users テーブルのカラムは

id:int
name:varchar(32)
gender:int
register_date:datetime

とする
0411nobodyさん2016/11/15(火) 16:47:40.26ID:???
>>404
この場合の User クラスは
class User
{
private $id = null; private $name = null; private $gender = null; private $register_date = null; public function __get($key){
if(!isset($key)){
throw new Exception("The key you specified is invalid.");
}
return $this->$key;
}
public function __set($key, $val){
switch($key){
case "id":
$this->$key = (int)$val; break;
case "name":
$this->$key = (string)$val; break;
case "gender":
$this->$key = (int)$val; break;
case "register_date":
$this->$key = new DateTime($val); break;
default:
throw new Exception("Invalid parameter has been given.");
}
}
}
こうすれば、fetchした時点で型付けされる。
俺はなんて優しいんだよ。ほかのバカどもは一生俺にひれ伏せ。
0412nobodyさん2016/11/15(火) 16:48:50.77ID:???
なんか、改行が多すぎるとか文句言われるから見にくいコードになったけど
__get/__setの使い方はこれでわかんだろ。
0413nobodyさん2016/11/15(火) 16:49:21.89ID:???
ゼロ年代前半からこの手の話題が続いてる
興味がある人はそっち探して読むといいよ

例:
「Oh No! DTO!」??オブジェクトとデータ構造Add Star (2004年)
http://kakutani.com/20040227.html#p01

もうそろそろ馬鹿の一つ覚えのように「カプセル化」を連呼するのはやめようぜ (2007年)
http://blogs.wankuma.com/kacchan6/archive/2007/10/12/101603.aspx
0414nobodyさん2016/11/15(火) 16:53:20.07ID:???
>>411
なんだ、ただのシンタックスシュガー的な使い方か
個別のgetter/setterとなんらかわらんわ
0415nobodyさん2016/11/15(火) 16:58:57.20ID:???
PDO::FETCH_ASSOC使った方がよっぽどまし。
0416nobodyさん2016/11/15(火) 17:02:48.07ID:???
>>411
intのデータ取得してintで戻ってこないのか?
データベース何?
0417nobodyさん2016/11/15(火) 17:03:29.21ID:???
>>414
>個別のgetter/setterとなんらかわらんわ

うわぁ、サル全開!

getterやsetterで同じこと実装してみろよ。
どうなるか予想つかないのかよゴミクズは。
0418nobodyさん2016/11/15(火) 17:04:21.54ID:???
>>416
MySQLは戻らんだろ。おまえのMySQLは戻るのか?
0419nobodyさん2016/11/15(火) 17:05:02.99ID:???
>>417
横からですいません。全く思いつきません…
よければ頂きたいです。
0420nobodyさん2016/11/15(火) 17:05:21.80ID:???
てか、ドライバ次第だけどな。
>>416はどんな環境でやってんのよ?
0421nobodyさん2016/11/15(火) 17:06:03.34ID:???
>>419
書いてみろよ、サル。
横から来たら努力しなくていいなんて法はねぇよ
0422nobodyさん2016/11/15(火) 17:11:23.40ID:???
>>411
そのマジックメソッドがないとどうなるか知ってるの?
0423nobodyさん2016/11/15(火) 17:19:14.05ID:???
case "id":
$this->$key = (int)$val; break;
これが動作することってあるの?
0424nobodyさん2016/11/15(火) 17:21:04.52ID:???
>>422
質問を質問で返すな、バカ
0425nobodyさん2016/11/15(火) 17:21:34.43ID:???
>>423
なんか間違えたか?
具体的に指摘しろ、腰抜け
0426nobodyさん2016/11/15(火) 17:22:56.61ID:???
相変わらずPHPスレはノータリンばっかりだな
0427nobodyさん2016/11/15(火) 17:23:55.21ID:???
試せばわかることを。
0428nobodyさん2016/11/15(火) 17:25:12.49ID:???
今日は FETCH_CLASS を知ったから得意満面でコードを書いたんだろうけど、なぁ
0429nobodyさん2016/11/15(火) 17:25:33.74ID:???
PDO::FETCH_LATEする前提なんだろうけど
0430nobodyさん2016/11/15(火) 17:26:26.11ID:???
>>429
それを知らなかったんでしょう。
>>410 では言及してない
0431nobodyさん2016/11/15(火) 17:32:07.76ID:???
プログラムが生まれて数十年
未だにカプセル化で論争が起こっています
0432nobodyさん2016/11/15(火) 17:34:26.74ID:???
>>427-428 みたいなアホはほおって置く

>>429-230 PHPマニュアルに記載されていない事なんてしりまっしぇーん
載ってからかたってくださぁい
0433nobodyさん2016/11/15(火) 17:35:31.85ID:???
今日もあいかわらずPHPerはバカばっかりだねぇ
0434nobodyさん2016/11/15(火) 17:37:21.98ID:???
>>432
http://php.net/manual/ja/pdostatement.fetch.php

PDO::FETCH_CLASSはプロパティセット後にコンストラクタ
逆にするにはPDO::FETCH_LATEを追加指定
0435nobodyさん2016/11/15(火) 17:38:13.86ID:???
FETCH_PROPS_LATEか
0436nobodyさん2016/11/15(火) 17:40:13.19ID:???
FETCH_PROPS_LATE ね。
使ったことがあれば FETCH_LATE が誤記だと気づくし、意図もわかる。
分からないってことは FETCH_PROPS_LATE を知らないし、もちろんそれを前提としてはいなかったってことだ。
0437nobodyさん2016/11/15(火) 17:40:55.66ID:???
>>434-435
対象がすり替わってる話なんか聞く耳もちまっせーん
今までの話に何の関係があるのかもわかりまっしぇーん
論旨をのべてくださーい

ばーか
0438nobodyさん2016/11/15(火) 17:41:54.06ID:???
> そもそもグラマには向いてないのさ。
これかっこいいよね。
0439nobodyさん2016/11/15(火) 17:42:01.37ID:???
>>436
>使ったことがあれば意図もわかる。

意図を述べて下しゃーい

ばーか
0440nobodyさん2016/11/15(火) 17:42:42.05ID:???
>>438
うん、お前はかっこ悪いけどね
0441nobodyさん2016/11/15(火) 17:42:42.33ID:???
>>437
すり替わってもないしドンピシャの話ですよ。聞く耳持たなくていいの?
0442nobodyさん2016/11/15(火) 17:43:14.81ID:???
>>441
だから「述べて下さい」って聞く耳持ってるのに言わないのは お ま え
0443nobodyさん2016/11/15(火) 17:43:50.71ID:???
>>437
つまりコンストラクタ呼び出し前にプロパティがセットされるから, 定義したマジックメソッドの__setter/__getterは呼ばれない
フェッチ時に型固定は実現されない
0444nobodyさん2016/11/15(火) 17:45:30.85ID:???
>>443
あほなの?

じゃあ、その後でプロパティ再セットすればいいだけじゃん。それで型強制される。
それがお前の答えだったの? 本当のノータリンだったの?
0445nobodyさん2016/11/15(火) 17:45:53.35ID:???
>>444
もっかいいうけど、試したら分かる
0446nobodyさん2016/11/15(火) 17:47:38.73ID:???
全部stringで帰ってきちゃうMySQLからとってきたデータを型矯正するのに
なんかいい方法無い?ってことで話した話なのに、

FETCH_PROPS_LATE したら 「__set 呼ばれないだろ!」 って、バカ?

呼べばいいいじゃん。てかPDO::FETCH_PROPS_LATE しなきゃいいじゃん
0447nobodyさん2016/11/15(火) 17:48:10.30ID:???
>>445

おまえは試さないと出来ることがわからないのか? サル
0448nobodyさん2016/11/15(火) 17:49:00.86ID:???
>>446
そも__setterいらないじゃん
コンストラクタで型固定再代入して終わり
0449nobodyさん2016/11/15(火) 17:50:19.60ID:???
>>448
おまえは別のタイプのサルだから黙ってろ、レベル低すぎて話にならない。
何でマジックメソッドがあるのかもわかってない。
0450nobodyさん2016/11/15(火) 17:51:14.12ID:???
おい、で、どうしたんだよ、 FETCH_PROPS_LATEバカ、
なんか答えろよ
0451nobodyさん2016/11/15(火) 17:52:23.57ID:???
かなりまえのシングルクオートエスケープバカと似た臭がするな…  FETCH_PROPS_LATE
0452nobodyさん2016/11/15(火) 17:52:24.21ID:???
かなりまえのシングルクオートエスケープバカと似た臭がするな…  FETCH_PROPS_LATE
0453nobodyさん2016/11/15(火) 17:52:25.75ID:???
__setが呼ばれるかどうかはFETCH_PROPS_LATE の有無に左右されない。
0454nobodyさん2016/11/15(火) 17:54:07.07ID:???
なにこれ? いらねーよ、そんなもん

429 : nobodyさん2016/11/15(火) 17:25:33.74 ID:???
PDO::FETCH_LATEする前提なんだろうけど
430 : nobodyさん2016/11/15(火) 17:26:26.11 ID:???
>>429
それを知らなかったんでしょう。
>>410 では言及してない
0455nobodyさん2016/11/15(火) 17:55:08.79ID:???
> 453 : nobodyさん2016/11/15(火) 17:52:25.75 ID:???
> __setが呼ばれるかどうかはFETCH_PROPS_LATE の有無に左右されない。

呼ばれなきゃ、自前でよべばいいだろ。
呼ばれないこと、自分でわかってんだろ?

わかってねーのか? ノータリン
0456nobodyさん2016/11/15(火) 17:56:37.64ID:???
でさ、

> $users = $stmt->fetchAll(PDO::FETCH_CLASS, 'User');

してさ、

> __setが呼ばれるかどうかはFETCH_PROPS_LATE の有無に左右されない。

__set()呼ばれないケースって、どんなの?

ちょっとこの無知な俺に教えてくれよ、サル
0457nobodyさん2016/11/15(火) 17:57:37.90ID:???
>>456
>>411 の時
0458nobodyさん2016/11/15(火) 17:59:15.36ID:???
>>457

へぇ、呼ばれないんだ。

何でそう思うの? ちょっとメカニズムを教えてくれる?
0459nobodyさん2016/11/15(火) 18:02:27.86ID:???
>>458
コンストラクタコール前は無名クラス(stdClassか)オブジェクトなんだから__setは未定義だろう
0460nobodyさん2016/11/15(火) 18:03:10.48ID:???
>>458
可視なプロパティだから
0461nobodyさん2016/11/15(火) 18:07:34.17ID:???
>>459
__construct()が無いことを言ってるのかな?

はいはい、それは正しいね。
掲示板の書き込みで端折った部分だが、君の指摘は正しい。

で、それだけのために、こんなにレス消費したの?
なんか、お前の最初の主張はそうところじゃなかったんじゃなかったっけ?

それとも、お前の趣旨は別のところ?
ちょっと具体的に説明してみなよ。おまえがチキンじゃなければさ。
0462nobodyさん2016/11/15(火) 18:08:17.44ID:???
>>460
おまえ、だれ? 別のやつ?
0463nobodyさん2016/11/15(火) 18:09:33.54ID:???
w
0464nobodyさん2016/11/15(火) 18:09:54.09ID:???
>>461
コンストラクタ未定義だろうが定義済みだろうが指定クラスのインスタンス構築のタイミングより先にプロパティへの代入が行われてる
0465nobodyさん2016/11/15(火) 18:14:33.34ID:???
そろそろ今日のレスの中からあらさがしをする頃合い。
それが3時間ぐらい続くよ。
0466nobodyさん2016/11/15(火) 18:20:06.54ID:???
なんか、「やってみればわかる」とかいう奴いるからてきとーにやってみたけど
__constructとか関係ねーじゃん ふつーにできるじゃん

>>459 こいつ、なんなの? 本当にアホなの
0467nobodyさん2016/11/15(火) 18:22:02.56ID:???
本当に FETCH_PROPS_LATEバカ は何だったの?
何が主張したかったの?
PHPerって、本当にアホだらけなの?
0468nobodyさん2016/11/15(火) 18:24:20.84ID:???
めでたしめでたし
0469nobodyさん2016/11/15(火) 18:24:29.09ID:???
>>467
敷居が低いならそりゃ平均は下がる
どういうコード書いても表示されればいいしな
諦めよう
0470nobodyさん2016/11/15(火) 18:26:43.68ID:???
>>469
別に、敷居が低いことはなんとも思わねーよ

問題なのは、さもわかってる風な体で「PDO::FETCH_LATEする前提なんだろうけど」「それを知らなかったんでしょう。」とか
恥ずかしげもなく書く馬鹿だ。

おまえがなんにも分かってねーじゃん。

こいつ、本当にシングルクオートエスケープバカ臭するよ
0471nobodyさん2016/11/15(火) 18:28:35.38ID:???
ああ、こんなのあったのか、気づかなかった

> 464 : nobodyさん2016/11/15(火) 18:09:54.09 ID:???
> >>461
> コンストラクタ未定義だろうが定義済みだろうが指定クラスのインスタンス構築のタイミングより先にプロパティへの代入が行われてる


やってみればわかるよ、サル
0472nobodyさん2016/11/15(火) 18:32:50.96ID:???
>指定クラスのインスタンス構築のタイミングより先にプロパティへの代入が行われてる

インスタンス出来てないのに、どうやってそのプロパティにアクセスするんだよw

ちょっとそのメカニズムを説明してくれよw
0473nobodyさん2016/11/15(火) 18:38:16.81ID:???
ま さ し く ご み く ず PDO::FETCH_LATE
0474nobodyさん2016/11/15(火) 18:43:08.25ID:???
流れはええよ。
>>411 のコードで __set が呼ばれたってことなの?
0475nobodyさん2016/11/15(火) 18:47:08.10ID:???
伸びてると思ったら馬鹿が一人いるな>>470
0476nobodyさん2016/11/15(火) 19:13:37.91ID:???
>>474
やってみれば良いじゃん、サル

問題点があるならそれを言えば良いじゃん、サル

なんでこう、エテしかいないの?
0477nobodyさん2016/11/15(火) 19:14:58.41ID:???
>>475
論拠を言えよ、ノータリン
0478nobodyさん2016/11/15(火) 19:22:56.40ID:???
ま さ し く ご み く ず PDO::FETCH_LATE
0479nobodyさん2016/11/15(火) 19:52:19.79ID:???
>>466
呼ばれないじゃん, 嘘まで書くのかよ

実行コード
ttp://ideone.com/79O9un
0480nobodyさん2016/11/15(火) 19:56:08.76ID:???
実行環境は PHP7.0.10 + MariaDB10.1
0481nobodyさん2016/11/15(火) 20:27:32.63ID:???
流れ的に彼の環境では呼ばれてるはずなんだよなぁ
0482nobodyさん2016/11/15(火) 21:19:11.95ID:???
>>472
PHPで見てればその通りだけどPDOはC言語で実装されてるんだからどうとでも出来る
0483nobodyさん2016/11/15(火) 22:44:45.13ID:???
php的にはstdclassかなんか構造体的なものを作った後にクラスにキャストするとかだろうから、別にインスタンス無くても初期化(何の?)は動くんじゃね。
0484nobodyさん2016/11/16(水) 21:25:01.78ID:???
>>479

嘘は書いてないが、間違いはあったので訂正する。

private $id = null;
private $name = null;
private $gender = null;
private $register_date = null;

これを削除して実行してみろ。
ちゃんと呼ばれるから。
■ このスレッドは過去ログ倉庫に格納されています