PHP質問・雑談スレ 2【初心者お断り(ROM歓迎)】©5ch.io
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん 転載ダメ©2ch.net
2016/10/17(月) 21:44:12.59ID:???初心者お断り(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の改造
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:???>>383はアホだからほっとけ
>>385
定義すれば型矯正ができるが、PHP様にはマジックメソッドというものがあるので
明示的にgetter/setterは作らない
0394nobodyさん
2016/11/15(火) 15:09:20.45ID:???__set()
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:???別に混乱してないと思うが。
>>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:???0399nobodyさん
2016/11/15(火) 16:08:24.97ID:???については多弁なんだな
0406nobodyさん
2016/11/15(火) 16:28:38.53ID:???0407nobodyさん
2016/11/15(火) 16:37:12.33ID:???0410nobodyさん
2016/11/15(火) 16:45:53.53ID:???しょうがねぇな、では、真面目に答える。
なんかうまく書き込みできねーから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:???この場合の 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
0415nobodyさん
2016/11/15(火) 16:58:57.20ID:???0417nobodyさん
2016/11/15(火) 17:03:29.21ID:???>個別のgetter/setterとなんらかわらんわ
うわぁ、サル全開!
getterやsetterで同じこと実装してみろよ。
どうなるか予想つかないのかよゴミクズは。
0423nobodyさん
2016/11/15(火) 17:19:14.05ID:???$this->$key = (int)$val; break;
これが動作することってあるの?
0426nobodyさん
2016/11/15(火) 17:22:56.61ID:???0427nobodyさん
2016/11/15(火) 17:23:55.21ID:???0428nobodyさん
2016/11/15(火) 17:25:12.49ID:???0429nobodyさん
2016/11/15(火) 17:25:33.74ID:???0431nobodyさん
2016/11/15(火) 17:32:07.76ID:???未だにカプセル化で論争が起こっています
0432nobodyさん
2016/11/15(火) 17:34:26.74ID:???>>429-230 PHPマニュアルに記載されていない事なんてしりまっしぇーん
載ってからかたってくださぁい
0433nobodyさん
2016/11/15(火) 17:35:31.85ID:???0434nobodyさん
2016/11/15(火) 17:37:21.98ID:???http://php.net/manual/ja/pdostatement.fetch.php
PDO::FETCH_CLASSはプロパティセット後にコンストラクタ
逆にするにはPDO::FETCH_LATEを追加指定
0435nobodyさん
2016/11/15(火) 17:38:13.86ID:???0436nobodyさん
2016/11/15(火) 17:40:13.19ID:???使ったことがあれば FETCH_LATE が誤記だと気づくし、意図もわかる。
分からないってことは FETCH_PROPS_LATE を知らないし、もちろんそれを前提としてはいなかったってことだ。
0437nobodyさん
2016/11/15(火) 17:40:55.66ID:???対象がすり替わってる話なんか聞く耳もちまっせーん
今までの話に何の関係があるのかもわかりまっしぇーん
論旨をのべてくださーい
ばーか
0438nobodyさん
2016/11/15(火) 17:41:54.06ID:???これかっこいいよね。
0443nobodyさん
2016/11/15(火) 17:43:50.71ID:???つまりコンストラクタ呼び出し前にプロパティがセットされるから, 定義したマジックメソッドの__setter/__getterは呼ばれない
フェッチ時に型固定は実現されない
0444nobodyさん
2016/11/15(火) 17:45:30.85ID:???あほなの?
じゃあ、その後でプロパティ再セットすればいいだけじゃん。それで型強制される。
それがお前の答えだったの? 本当のノータリンだったの?
0446nobodyさん
2016/11/15(火) 17:47:38.73ID:???なんかいい方法無い?ってことで話した話なのに、
FETCH_PROPS_LATE したら 「__set 呼ばれないだろ!」 って、バカ?
呼べばいいいじゃん。てかPDO::FETCH_PROPS_LATE しなきゃいいじゃん
0449nobodyさん
2016/11/15(火) 17:50:19.60ID:???おまえは別のタイプのサルだから黙ってろ、レベル低すぎて話にならない。
何でマジックメソッドがあるのかもわかってない。
0450nobodyさん
2016/11/15(火) 17:51:14.12ID:???なんか答えろよ
0451nobodyさん
2016/11/15(火) 17:52:23.57ID:???0452nobodyさん
2016/11/15(火) 17:52:24.21ID:???0453nobodyさん
2016/11/15(火) 17:52:25.75ID:???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:???> __setが呼ばれるかどうかはFETCH_PROPS_LATE の有無に左右されない。
呼ばれなきゃ、自前でよべばいいだろ。
呼ばれないこと、自分でわかってんだろ?
わかってねーのか? ノータリン
0456nobodyさん
2016/11/15(火) 17:56:37.64ID:???> $users = $stmt->fetchAll(PDO::FETCH_CLASS, 'User');
してさ、
> __setが呼ばれるかどうかはFETCH_PROPS_LATE の有無に左右されない。
__set()呼ばれないケースって、どんなの?
ちょっとこの無知な俺に教えてくれよ、サル
0459nobodyさん
2016/11/15(火) 18:02:27.86ID:???コンストラクタコール前は無名クラス(stdClassか)オブジェクトなんだから__setは未定義だろう
0461nobodyさん
2016/11/15(火) 18:07:34.17ID:???__construct()が無いことを言ってるのかな?
はいはい、それは正しいね。
掲示板の書き込みで端折った部分だが、君の指摘は正しい。
で、それだけのために、こんなにレス消費したの?
なんか、お前の最初の主張はそうところじゃなかったんじゃなかったっけ?
それとも、お前の趣旨は別のところ?
ちょっと具体的に説明してみなよ。おまえがチキンじゃなければさ。
0463nobodyさん
2016/11/15(火) 18:09:33.54ID:???0464nobodyさん
2016/11/15(火) 18:09:54.09ID:???コンストラクタ未定義だろうが定義済みだろうが指定クラスのインスタンス構築のタイミングより先にプロパティへの代入が行われてる
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:???何が主張したかったの?
PHPerって、本当にアホだらけなの?
0468nobodyさん
2016/11/15(火) 18:24:20.84ID:???0470nobodyさん
2016/11/15(火) 18:26:43.68ID:???別に、敷居が低いことはなんとも思わねーよ
問題なのは、さもわかってる風な体で「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:???0476nobodyさん
2016/11/15(火) 19:13:37.91ID:???やってみれば良いじゃん、サル
問題点があるならそれを言えば良いじゃん、サル
なんでこう、エテしかいないの?
0478nobodyさん
2016/11/15(火) 19:22:56.40ID:???0480nobodyさん
2016/11/15(火) 19:56:08.76ID:???0481nobodyさん
2016/11/15(火) 20:27:32.63ID:???0483nobodyさん
2016/11/15(火) 22:44:45.13ID:???0484nobodyさん
2016/11/16(水) 21:25:01.78ID:???嘘は書いてないが、間違いはあったので訂正する。
private $id = null;
private $name = null;
private $gender = null;
private $register_date = null;
これを削除して実行してみろ。
ちゃんと呼ばれるから。
0485nobodyさん
2016/11/16(水) 21:32:09.93ID:???全く自分の頭を使わずに「呼ばれないじゃん」と騒ぐバカのためにこんなに優しく教えてやるとは…
>>479は、毎晩俺に感謝の意を表してから寝ろよ。
0486nobodyさん
2016/11/16(水) 21:45:52.76ID:???-------------------------------------------------------
434 : nobodyさん2016/11/15(火) 17:37:21.98 ID:???
>>432
http://php.net/manual/ja/pdostatement.fetch.php
PDO::FETCH_CLASSはプロパティセット後にコンストラクタ
逆にするにはPDO::FETCH_LATEを追加指定
443 : nobodyさん2016/11/15(火) 17:43:50.71 ID:???
>>437
つまりコンストラクタ呼び出し前にプロパティがセットされるから, 定義したマジックメソッドの__setter/__getterは呼ばれない
フェッチ時に型固定は実現されない
0488nobodyさん
2016/11/16(水) 21:56:55.12ID:???class Hoge
{
private $p_id = null;
private $p_name = null;
private $p_gender = null;
private $p_register_date = null;
(略)
public function __set($key, $val){
echo('__set called'.PHP_EOL);
switch($key){
case "id":
$key = "p_{$key}";
$this->$key = (int)$val; break;
case "name":
$key = "p_{$key}";
$this->$key = (string)$val; break;
case "gender":
$key = "p_{$key}";
$this->$key = (int)$val; break;
case "register_date":
$key = "p_{$key}";
$this->$key = new DateTime($val); break;
default:
throw new Exception("Invalid parameter has been given.");
}
}
}
■ このスレッドは過去ログ倉庫に格納されています