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

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

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

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

Q&A

解決済

5回答

1080閲覧

PHPでオブジェクト指向を実現したいです。助言をください。

plato

総合スコア44

PHP

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

0グッド

1クリップ

投稿2018/05/03 10:32

編集2018/05/03 10:42

前提・実現したいこと

PHPにて、オブジェクト指向プログラミングを目指しています。
しかし、初めに、手続き型でプログラミングを学んだことから、なかなかオブジェクト指向での実装ができません。
そこで、次のプログラムを例にオブジェクト指向を実現するには、あるいは、みなさんだったらどう実装するかをご教授願えると助かります。

要求仕様

同じ長さの二つの文字列 A, Bが存在する。
A, Bを比較して、以下の条件で値を返す。
2つの文字列のスペルがまったく同じであれば、2を返す。
二つの文字列のスペルが1つだけ異なる場合、1を返す。
その他は、0を返す。

例)
A:"teratail"
B:"teratair"
この場合、1を返す。

該当のソースコード

PHP

1<?php 2 class Hoge{ 3 4 5 private $count = 0; 6 private $output = 0; 7 8 9 public function compare($a, $b){ 10 $this->count = 0; 11 for($i = 0; $i < strlen($a); $i++) { 12 if($this->isSame($a[$i], $b[$i]) == 1){ 13 $this->count +=1; 14 } 15 } 16 if($this->count == 0){ 17 $this->output +=2; 18 } 19 if($this->count == 1 ){ 20 $this->output +=1; 21 } 22 23 return $this->output; 24 } 25 public function isSame($a, $b){ 26 if ($a !== $b) { 27 return 1; 28 } 29 else{ 30 return 0; 31 } 32 } 33 34 } 35 $hoge = new Hoge; 36 echo ($hoge->compare("hoge", "hogu")); //1を返す 37 38?>

補足情報

個人的に気にかかっている点として、カウンタを使用していることです。
カウンタを使うのは手続き型のイメージがあります。
もし、カウンタを用いることが望ましくない場合、用いない場合の実装などを教えていただければ幸いです。

参考情報

オブジェクト指向の参考記事
https://ameblo.jp/principia-ca/entry-11876117369.html

問題の元ネタ(paizaは提出コードを公開できないので、内容を改変しています。)
https://paiza.jp/student/challenges/116/page/problem

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

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

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

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

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

m.ts10806

2018/05/03 10:35

オブジェクト指向については何か参考にした文献や記事などはありますか?
m.ts10806

2018/05/03 10:37

正直この要件だけだとオブジェクト指向にしたとしてもほぼ恩恵を得られません。
m.ts10806

2018/05/03 10:37

参考記事などは回答に必要な材料となるので質問本文に追記してください。
plato

2018/05/03 10:42

失礼しました。追加しました
退会済みユーザー

退会済みユーザー

2018/05/03 10:42

なんでこういう、実務ではおおよそありえなそうな例題を出すかな。
退会済みユーザー

退会済みユーザー

2018/05/03 10:44

$this->outputを初期化する概念がないのがニントモカントモ
m.ts10806

2018/05/03 10:46 編集

オーソドックスな例で車とか「役割をしっかりわけられる」ようなものとか、掲示板とかDB絡めた方がしっかり使えそうですね。せめてプロパティ共有するとかくらいはしたいですが、この要件だとそもそもローカル変数のみで済むので・・・。
退会済みユーザー

退会済みユーザー

2018/05/03 10:50

paizaみれないけど、あそこの問題って実務ではおおよそ関係ない問題ばっかなのであんま、相手にしてない。
退会済みユーザー

退会済みユーザー

2018/05/03 10:57

オブジェクト指向といったら、キャットドア課題でしょ。
退会済みユーザー

退会済みユーザー

2018/05/03 11:08

2文字以上食い違っていたらどうしたらいいんだろう、teratailとraratailとか
退会済みユーザー

退会済みユーザー

2018/05/03 11:08

就活のチャレンジは公開されてない(会員登録必須)なので答えかねるほうにいきそうだな
plato

2018/05/03 11:13

paiza見れないですよね。失礼いたしました...問題と内容を変えてはいるのですが、それでも不適切な場合は質問自体を消します。
退会済みユーザー

退会済みユーザー

2018/05/03 11:17

質問が不適切なわけじゃないけど、もっと現実味あるお題じゃないと座布団取りに行く食尻が湧かないっす。
m.ts10806

2018/05/03 11:18

でしたら私の回答はベストアンサーとしては不適切なので、もう少し回答を待ってみては?
退会済みユーザー

退会済みユーザー

2018/05/03 11:24

だから、やっぱりキャットドア課題をやるのが一番なんですよ。
guest

回答5

0

オブジェクト使うんなら、多分こんな方向性

php

1<?php 2class ArrayOfString{ 3 public $str_org; 4 public $str_arr; 5 function __construct($str){ 6 $this->str_org = $str; 7 $this->str_arr = str_split($str); 8 } 9 10} 11$test_arr = ['hoge', 'hoga', 'hoeg', 'hgeo']; 12$hoge = new ArrayOfString('hoge'); 13foreach($test_arr as $val){ 14 $str = new ArrayOfString($val); 15 echo $hoge->str_org.'と'.$str->str_org.'の比較:'; 16 $count = count(array_diff_assoc($hoge->str_arr, $str->str_arr)); 17 echo $count>=2?0:!$count+1; 18 echo PHP_EOL; 19}

投稿2018/05/03 12:15

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

オブジェクト指向で捉えるべき箇所が見つかりませんでした^^;

php

1<?php 2class Hoge{ 3 public function compare($a, $b){ 4 $a_arr = str_split($a); 5 $b_arr = str_split($b); 6 $count = count(array_diff_assoc($a_arr, $b_arr)); 7 return $count>=2?0:!$count+1; 8 } 9} 10$test_arr = ['hoge', 'hoga', 'hoeg']; 11$hoge = new Hoge; 12foreach($test_arr as $val){ 13 echo ($hoge->compare("hoge", $val)).PHP_EOL; 14}

オブジェクト指向で考えるなら、文字列 a,文字列 b をオブジェクト化してゴニョゴニョやるんじゃないかなぁ。。。

投稿2018/05/03 11:37

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/05/03 12:17

全くもって、おっしゃる通りでございます。
guest

0

そもそもPHPだけではオブジェクト指向分からないし難しいこと気にする前に
良いコード書けるようになるのが先。

試してないけど今回のならarray_diff_assoc()辺り使えば簡単に比較できるかも。

投稿2018/05/03 11:11

kawax

総合スコア10377

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

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

退会済みユーザー

退会済みユーザー

2018/05/03 11:13

何がそもそもなのか分からNice.
退会済みユーザー

退会済みユーザー

2018/05/03 11:17

サンプルコードを書いて検証したいところですね
guest

0

ベストアンサー

質問に対する直接的な回答ではありません。あくまで参考記事紹介です。

記事としては下記とか、

実践もあるなら下記とか

参考にされた方が良いかも。

投稿2018/05/03 10:49

編集2018/05/03 10:50
m.ts10806

総合スコア80850

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

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

plato

2018/05/03 11:17

ご回答ありがとうございました。みなさんの意見を拝見するにオブジェクト指向を学習の目的にする場合、paizaなどではなく、教えていただいたサイトなどを参考にした方がよさそうですね。そちらで学習したいと思います。ありがとうございました。
guest

0

2つの文字列のスペルがまったく同じであれば、2を返す。
二つの文字列のスペルが1つだけ異なる場合、1を返す。
その他は、0を返す。

3行それぞれを評価するのに、最も重い処理は2を返す条件じゃないかな、
次に重いのは1を返す条件で、
簡単に判別できて大多数の結果がそうなるであろう条件は0。
って考えると、
0を返す条件をもう少し深掘りする。

・互いの文字列長が異なる

って判定を最初に持ってくれば、さっさと0を返して終われる判定。

$this->outputをわざわざ使う理由がよくわからないけど、
メソッド内ローカル変数を使ってもいいんだよ。

一文字でも違っていれば1を返すのだから、
文字列のアタマから照合して

public function compare($a, $b){ if (strlen($a) !== strlen($b)) { return 0; } $count = 0; for($i = 0; $i < strlen($a); $i++) { if($this->isSame($a[$i], $b[$i]) == 1){ $count +=1; } } if($this->count == 0){ return 2; } else { return 1; } }

ってのはダメでしょうか。

投稿2018/05/03 10:46

編集2018/05/03 11:05
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/05/03 10:53

あのさぁ…
退会済みユーザー

退会済みユーザー

2018/05/03 11:00

アルゴリズム的にも気になったところがあったので、加筆してみました。
m.ts10806

2018/05/03 11:01

m6uさん おかしくないですよ。 $a = "abcdef"; echo $a[2]; //c
退会済みユーザー

退会済みユーザー

2018/05/03 11:05 編集

あ、すみませんでした。substr()の例にちゃんと説明がありましたね。
退会済みユーザー

退会済みユーザー

2018/05/03 11:05

もう、その辺の緩さがPHPの最大の魅力なのに、それを否定されちゃうと…
退会済みユーザー

退会済みユーザー

2018/05/03 11:37

スコア2をもっていて 不一致文字があるごとにスコアー1で0が最低なら ここまでシンプルにできるが(※ 即興版なので マルチバイト文字は意識sていない ) https://ideone.com/4pZotG
退会済みユーザー

退会済みユーザー

2018/05/03 11:53

5行程度でおわるのをどうしてクラスにして肥大化するんだろう
退会済みユーザー

退会済みユーザー

2018/05/03 12:10

asahina は寝てた方が良かったな。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問