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

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

ただいまの
回答率

90.51%

  • PHP

    20408questions

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

オブジェクト指向について(PDOのDB接続クラスの自作)

解決済

回答 3

投稿

  • 評価
  • クリップ 6
  • VIEW 2,874

taishi_574

score 29

phpのPDOでのデータベースへの接続をクラス化するものを自作しています。
その中でオブジェクト指向について疑問ができたので質問させてください。

最初は下記のように
・ホスト名
・データベース名
・ユーザー名
・パス
を直接書いていたのですが、直接書くのはどうかと思い
上の4つを別の設定ファイルを作り、上の階層に置くことにしました。
以下が変更前のコードです。

//index.php

$obj=new connect();
//pdo.php

<?php
class connect {
  function pdo(){
    //データベースオープン
    try {
    $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8','user','pass');
  } catch (PDOException $e) {
    exit('データベース接続失敗。'.$e->getMessage());
  }
    //エラーを表示してくれる。
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
    return $pdo;
  }
}
?>

そして、完成したのが下記のものです。
これでiniファイルを作り正常に接続できたのですが、
クラス名とiniファイルを読み込むメソッド名を同じにしないと
データベース接続失敗。と表示されます。

質問です。
これは$obj=new connect();としたときに、
同じメソッド名のfunction connect()も呼ばれているということ
なのでしょうか?

よろしくお願いします。

//index.php

$obj=new connect();
```ここに言語を入力  
//ini.php  

<?php  
mb_language('Japanese');  
mb_internal_encoding('utf-8');  

//MySQL接続設定  
$strDb='test';  
$strHost="localhost";  
$strUser="user";  
$strPass="pass";  
?>  
//pdo.php  

<?php  
class connect {  

//コンストラクタ  
function connect(){  
$strIniFile = "../../ini/ini.php";  
require_once($strIniFile);  
$this->Host   = $strHost;  
$this->User   = $strUser;  
$this->Pass   = $strPass;  
$this->DbName = $strDb;  
}  

function pdo(){  
//データベースオープン  
try {  
$pdo = new PDO('mysql:host='.$this->Host.';dbname='.$this->DbName.';charset=utf8',$this->User,$this->Pass);  
} catch (PDOException $e) {  
exit('データベース接続失敗。'.$e->getMessage());  
}  
//エラーを表示してくれる。  
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);  
return $pdo;  
}  

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

+5

これは$obj=new connect();としたときに、 
同じメソッド名のfunction connect()も呼ばれているということ 
なのでしょうか?

はい、そうです。
コメントに
//コンストラクタ
とありますが、コンストラクタ=そのクラスのオブジェクトが生成される際に実行されるメソッドです。

公式PHPマニュアル

PHP 3 や PHP 4 との下位互換性を維持するため、もし PHP がクラスの construct() 関数を見つけられない場合は、 古い形式のコンストラクタ (つまりクラス名と同じ名前の関数)を捜します。 事実上、互換性の問題が発生する可能性があるのは、 そのクラスが construct() という名前のメソッドを 異なる用途で用いてる場合だけです。

にあるように(少しわかりにくいですが)、PHP(7未満)では名前空間が定義されていないクラス内に__construct()が定義されていない場合、クラス名と同名のメソッドが存在する場合に同名のメソッドがコンストラクタとして扱われます。

ただ、これは古い形式なので、今から書くコードとして推奨されるものでは無いので
__construct()をコンストラクタとして定義することをお勧めします。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/01/22 14:16

    なるほど、これがコンストラクタというやつだったんですね。
    名前は聞いたことがあったのですがいまいち理解できてなかったようです。

    __constructと書き換え動作しました!

    初歩的な質問にお答えいただきありがとうございました!

    キャンセル

+4

簡単なコードや検証コードなど、軽量なものを書くときに使っているコードをサンプルとして回答しておきます。

<?php
/**
 * index.php
 */
require 'common.php';

$db = DB::getInstance();

$name = filter_input(INPUT_POST, 'name');
$sql = 'SELECT * FROM table WHERE name = :name';
$params = [
    ':name' => $name
];
$rows = $db->select($sql, $params, 0, 10);
?>
<!DOCTYPE HTML>
<html lang="ja">
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <div>
            <?php if (0 < count($rows)) : ?>
                <table>
                    <?php foreach ($rows as $row) : ?>
                        <tr>
                            <td><?= h($row['id']); ?></td>
                        </tr>
                    <?php endforeach; ?>
                </table>
            <?php else: ?>
                <div>検索しましたが見つかりませんでした。</div>
            <?php endif; ?>
        </div>
    </body>
</html>
<?php

/**
 * common.php
 */
require 'config.php';

/**
 * エスケープ
 * @param string $string
 * @return string
 */
function h($string)
{
    return htmlspecialchars($string, ENT_QUOTES, 'utf-8');
}

/**
 * autoload
 * @param string $className
 */
function autoload($className)
{
    $filename = sprintf('%s.php', $className);
    require $filename;
}

spl_autoload_register('autoload');
<?php

/**
 * config.php
 */
/**
 * DB関連設定
 */
define('DB_HOST', 'localhost');
define('DB_NAME', 'sample');
define('DB_USER', 'root');
define('DB_PASSWORD', 'password');
<?php

/**
 * DB.php
 */
class DB
{

    private static $instance = null;
    private $pdo = null;

    /**
     * getInstance
     * @return object
     */
    public static function getInstance()
    {
        if (is_null(self::$instance)) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    /**
     * clone
     * @throws Exception
     */
    final public function __clone()
    {
        throw new Exception("this instance is singleton class.");
    }

    /**
     * コンストラクタ
     */
    private function __construct()
    {
        $options = [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
            , PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
        ];

        $dsn = sprintf('mysql:host=%s;dbname=%s;charset=utf8'
            , constant('DB_HOST')
            , constant('DB_NAME')
        );

        $this->pdo = new PDO($dsn
            , constant('DB_USER')
            , constant('DB_PASSWORD')
            , $options
        );
    }

    /**
     * トランザクション
     */
    public function transaction()
    {
        if (!$this->pdo->inTransaction()) {
            $this->pdo->beginTransaction();
        }
    }

    /**
     * ロールバック
     */
    public function rollback()
    {
        if ($this->pdo->inTransaction()) {
            $this->pdo->rollBack();
        }
    }

    /**
     * コミット
     */
    public function commit()
    {
        if ($this->pdo->inTransaction()) {
            $this->pdo->commit();
        }
    }

    /**
     * SELECT
     * @param string $sql
     * @param array $params
     * @param int $start
     * @param int $limit
     * @param array recordset
     */
    public function select($sql, array $params = [], $start = 0, $limit = null)
    {
        $sql = trim($sql);
        if (!is_null($limit) && 0 < $limit) {
            $sql .= sprintf(' LIMIT %d offset %d', $limit, $start);
        }
        $stmt = $this->pdo->prepare($sql);
        $stmt->execute($params);
        return $stmt->fetchAll();
    }

    /**
     * UPDATE
     * @param string $sql
     * @param array $params
     * @return int rowCount
     */
    public function update($sql, array $params = [])
    {
        $stmt = $this->pdo->prepare($sql);
        $stmt->execute($params);
        return $stmt->rowCount();
    }

    /**
     * INSERT
     * @param string $sql
     * @param array $params
     * @return int lastInsertId
     */
    public function insert($sql, array $params = [])
    {
        $stmt = $this->pdo->prepare($sql);
        $stmt->execute($params);
        return $this->pdo->lastInsertId();
    }

    /**
     * DELETE
     * @param string $sql
     * @param array $params
     * @return int rowCount
     */
    public function delete($sql, array $params = [])
    {
        $stmt = $this->pdo->prepare($sql);
        $stmt->execute($params);
        return $stmt->rowCount();
    }

}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/01/22 14:16

    ありがとうございます。

    参考にさせていただきます!

    キャンセル

0

phpのコンストラクタは

void __construct ([ mixed $args = "" [, $... ]] )


ではないですか?

PHP: コンストラクタとデストラクタ - Manual 

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/01/21 21:26

    ご提示のURLにわかりにくく記載されていますが、
    PHP3やPHP4ではクラス名と同名のメソッドがコンストラクタとして扱われるという仕様であったため、
    下位互換性を維持するためPHP7未満のバージョンでは質問に提示されている形でコンストラクタとして動作します。

    キャンセル

  • 2017/01/22 08:14

    ありがとうございます! 大変勉強になりました!

    キャンセル

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

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

関連した質問

  • 解決済

    phpからmysqlへ、PDOを使って接続する時、エラーが出ます。

    phpからmysqlへ、PDOを使って接続する時、エラーが出ます。 phpからmysqlへ、PDOを使用して接続したいのですが、何故かエラーが出てしまうのです。 環境はxamm

  • 解決済

    MySQLを使ったPHP(フォーム)でのINSERT文

    MySQLを使ったPHP(フォーム)でのINSERT文でエラーコードはでていないのですが、なぜかINSERTされないために投稿させてもらいました。 <form action=

  • 解決済

    MYSQLにバイナリで保存した画像を表示する方法

    お世話になります。 現在、ユーザーからinput="file"で取得したデータをMYSQLにバイナリで保存し、このデータを出力するコードを作成しています。MYSQLにはバイナリデ

  • 受付中

    PHPのFatal errorについて

    気づけばプロ並みPHP という書籍で勉強しているのですが Fatal error: Uncaught exception 'PDOException' with message

  • 受付中

    フォームで受け取ったデータをデータベースに登録したい。

    新規登録画面を作成中です(入力内容をデータベースに保存) フォームで受け取ったデータを作成済みのテーブルに登録したいのですが、 うまくいきません。 調べてるうちにどんどんわか

  • 解決済

    PHP データベース

    PHPでエラーが起きてしまいました。 Fatal error: Call to a member function fetchAll() on null in /home/t

  • 解決済

    Mysqlに登録された文字を検索するには

    登録時の文字は以下のようなエスケープをした場合。 INSERT $stmt = $pdo -> prepare(....); $stmt->bindValue(':value

  • 解決済

    データベースへの追加

    先日に引き続きログインシステムの作成を練習してます。 フォームでユーザー名とパスワードを入力して移動すると、 catch部分で設定したエラーが返ってきます。(データベースに追加

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

  • PHP

    20408questions

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