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

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

ただいまの
回答率

90.50%

  • PHP

    20385questions

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

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

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 240

hogehogeman

score 12

 前提・実現したいこと

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

 要求仕様

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

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

 該当のソースコード

<?php
    class Hoge{


        private $count = 0;
        private $output = 0;


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

            return $this->output;
        }
        public function isSame($a, $b){
            if ($a !== $b) {
                return 1;
            }
            else{
                return 0;
            }
        }

    }
    $hoge = new Hoge;
    echo ($hoge->compare("hoge", "hogu")); //1を返す

?>

 補足情報

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

 参考情報

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    退会済みユーザー

    2018/05/03 20:17

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

    キャンセル

  • mts10806

    2018/05/03 20:18

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

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2018/05/03 20:24

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

    キャンセル

回答 5

+1

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

<?php
class Hoge{
    public function compare($a, $b){
        $a_arr = str_split($a);
        $b_arr = str_split($b);
        $count = count(array_diff_assoc($a_arr, $b_arr));
        return $count>=2?0:!$count+1;
    }
}
$test_arr = ['hoge', 'hoga', 'hoeg'];
$hoge = new Hoge;
foreach($test_arr as $val){
    echo ($hoge->compare("hoge", $val)).PHP_EOL;        
}


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/03 21:17

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

    キャンセル

+1

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

<?php
class ArrayOfString{
    public $str_org;
    public $str_arr;
    function __construct($str){
        $this->str_org = $str;
        $this->str_arr = str_split($str);
    }

}
$test_arr = ['hoge', 'hoga', 'hoeg', 'hgeo'];
$hoge = new ArrayOfString('hoge');
foreach($test_arr as $val){
    $str = new ArrayOfString($val);
    echo $hoge->str_org.'と'.$str->str_org.'の比較:';
    $count = count(array_diff_assoc($hoge->str_arr, $str->str_arr));
    echo $count>=2?0:!$count+1;
    echo PHP_EOL;
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

0

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

記事としては下記とか、

実践もあるなら下記とか

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/03 20:17

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

    キャンセル

-1

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 19:53

    あのさぁ…

    キャンセル

  • 2018/05/03 20:00

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

    キャンセル

  • 2018/05/03 20:01

    m6uさん
    おかしくないですよ。

    $a = "abcdef";
    echo $a[2];
    //c

    キャンセル

  • 2018/05/03 20:02 編集

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

    キャンセル

  • 2018/05/03 20:05

    もう、その辺の緩さがPHPの最大の魅力なのに、それを否定されちゃうと…

    キャンセル

  • 2018/05/03 20:37

    スコア2をもっていて 不一致文字があるごとにスコアー1で0が最低なら
    ここまでシンプルにできるが(※ 即興版なので マルチバイト文字は意識sていない )

    https://ideone.com/4pZotG

    キャンセル

  • 2018/05/03 20:53

    5行程度でおわるのをどうしてクラスにして肥大化するんだろう

    キャンセル

  • 2018/05/03 21:10

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

    キャンセル

-1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/03 20:13

    何がそもそもなのか分からNice.

    キャンセル

  • 2018/05/03 20:17

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

    キャンセル

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

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    20385questions

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