質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Q&A

解決済

2回答

3392閲覧

PHP class 値の受け渡し 練習

Z-TALBO

総合スコア525

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

0グッド

0クリップ

投稿2017/02/03 10:22

なんとなくなりに、PHPは触ってきています。
そろそろオブジェクト指向とかclassとかを触っていこうと思うのですが、、、
まだ漠然としすぎていて、自分でも整理できていないので、例を出して聞いてみたいと思います。

###コード

PHP

1class Test { 2 public $id; 3 public $name; 4 5 public function __construct() { 6 $this->id = filter_input(INPUT_POST, 'id'); 7 $this->name = filter_input(INPUT_POST, 'name'); 8 } 9 10 public function sayId() { 11 echo $this->id; 12 } 13 14 public function sayName() { 15 echo $this->name; 16 } 17} 18 19$test = new Test; 20$test->sayId(); // 1111 21$test->sayName(); // テスト

HTML

1<input type="number" name="id" value="1111"> 2<input type="text" name="name" value="テスト">

こんな感じですごく初歩の初歩なのですが、、、

次に

HTML

1<?php for($i = 0; $i < 3; $i++) * ?> 2 <input type="number" name="testArray[$i][id]"> 3 <input type="text" name="testArray[$i][name]"> 4<?php endfor; ?>

という配列ができるような感じのフォームを用意したとします。
とりあえず今までの受取方は

PHP

1$array_test = filter_input(INPUT_POST, 'testArray', FILTER_DEFAULT, array('flags' => FILTER_REQUIRE_ARRAY);

上記のような感じでとったりしていたのですが、どうもclassになるとなんか上手くいかず、、、
何がっていうのが、実はよくわかっていないのですが、、、
エラーではなくて、ただ値の受け渡しがうまくできてないんだと思います。

上記のclassを元にしたとき、配列でのやりかたとしてはどのように書かれていますか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

質問文の意味をあまり理解できなかったのですが、こうしてはいけないのでしょうか?

PHP

1<?php 2ini_set("display_errors", 1); 3error_reporting(E_ALL | E_STRICT); 4 5class Test 6{ 7 public $ids = array(); 8 public $names = array(); 9 public $testArray = array(); 10 11 public function __construct($id, $name, $array) 12 { 13 $this->ids = $id; 14 $this->names = $name; 15 $this->testArray = $array; 16 } 17 18 public function sayId($name) 19 { 20 $result = array(); 21 foreach ($this->names as $index => $value) { 22 if ($value === $name) { 23 array_push($result, $this->ids[$index]); 24 } 25 } 26 return $result; 27 } 28 29 public function sayName($id) 30 { 31 $result = array(); 32 foreach ($this->ids as $index => $value) { 33 if ($value === $id) { 34 array_push($result, $this->names[$index]); 35 } 36 } 37 return $result; 38 } 39} 40 41if (filter_input(INPUT_SERVER, "REQUEST_METHOD") === "POST") { 42 if (!empty(filter_input(INPUT_POST, "testArray", FILTER_DEFAULT, FILTER_REQUIRE_ARRAY))) { 43 $array = filter_input(INPUT_POST, "testArray", FILTER_DEFAULT, FILTER_REQUIRE_ARRAY); 44 $id = array(); 45 $name = array(); 46 47 if (array_key_exists("id", $array)) { 48 $id = $array["id"]; 49 } 50 51 if (array_key_exists("name", $array)) { 52 $name = $array["name"]; 53 } 54 55 $test = new Test($id, $name, $array); 56 print_r($test->sayId("value2"));//id -> 2 57 print_r($test->sayName("1"));//name -> value1 58 } 59} 60?> 61<!DOCUTYPE html> 62<html lang="ja"> 63<head> 64 <meta charset="UTF-8"> 65 <title>sample</title> 66 <style type="text/css"> 67 * { 68 margin: 0; 69 padding: 0; 70 } 71 72 .box { 73 display: block; 74 } 75 </style> 76</head> 77<body> 78forms<br> 79<form method="post" action=""> 80 <?php for ($i = 0; $i < 3; $i++) : ?> 81 <div class="box"> 82 <label><input type="number" name="testArray[id][<?= $i ?>]" value="<?= $i ?>"></label> 83 <label><input type="text" name="testArray[name][<?= $i ?>]" value="<?= "value" . $i ?>"></label> 84 </div> 85 <?php endfor; ?> 86 <input type="submit"> 87</form> 88</body> 89</html>

投稿2017/02/03 15:11

編集2017/02/03 15:54
s8_chu

総合スコア14731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Z-TALBO

2017/02/04 03:25

回答ありがとうございます! とても参考になりました、ありがとうございます!
guest

0

ベストアンサー

テストコードなのでクラスの位置づけも曖昧なので一概には言えないですが...
そもそもコンストラクタで直接POSTデータを参照しているのは、クラスがPOSTの構造に依存してしまってよくないと思いました。自分ならfilter_inputはクラスの外で行い、そのうちの必要な値をクラスのコンストラクタに渡しますかね。

※例外的にPOSTデータを扱う専用のクラスだったら直接POSTデータを参照してもかまわないと思いますよ

以下、簡単な例を書いてみました。

php

1<form method='POST'> 2<?php for($i = 0; $i < 3; $i++) : ?> 3 <input type="number" name="testArray[<?= $i ?>][id]" value="<?= $i+1 ?>"> 4 <input type="text" name="testArray[<?= $i ?>][name]" value="<?= 'テスト'.($i+1) ?>"> 5 <br> 6<?php endfor; ?> 7<input type="submit"> 8</form> 9 10<?php 11class Test { 12 public $id; 13 public $name; 14 15 public function __construct($id, $name) { 16 $this->id = $id; 17 $this->name = $name; 18 } 19 20 public function sayId() { 21 echo $this->id; 22 } 23 24 public function sayName() { 25 echo $this->name; 26 } 27} 28 29$array_test = filter_input(INPUT_POST, 'testArray', FILTER_DEFAULT, array('flags' => FILTER_REQUIRE_ARRAY)); 30if(is_array($array_test)) { 31 foreach($array_test as $input) { 32 $test = new Test($input['id'], $input['name']); 33 $test->sayId(); 34 $test->sayName(); 35 } 36}

投稿2017/02/03 15:13

popobot

総合スコア6586

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Z-TALBO

2017/02/04 03:26

回答ありがとうございました! 確かに、constructや、まだどこからclassでの処理でどれはページ内で書けばいいかなどを手探り状態になっていますので、またそういった部分で質問した際にはお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問