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

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

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

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

Q&A

解決済

3回答

9664閲覧

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

taishi_574

総合スコア39

PHP

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

3グッド

8クリップ

投稿2017/01/21 12:04

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; } } ?>
fumi35, zico_teratail, daisy👍を押しています

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

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

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

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

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

guest

回答3

0

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

php

1<?php 2/** 3 * index.php 4 */ 5require 'common.php'; 6 7$db = DB::getInstance(); 8 9$name = filter_input(INPUT_POST, 'name'); 10$sql = 'SELECT * FROM table WHERE name = :name'; 11$params = [ 12 ':name' => $name 13]; 14$rows = $db->select($sql, $params, 0, 10); 15?> 16<!DOCTYPE HTML> 17<html lang="ja"> 18 <head> 19 <meta charset="UTF-8"> 20 <title></title> 21 </head> 22 <body> 23 <div> 24 <?php if (0 < count($rows)) : ?> 25 <table> 26 <?php foreach ($rows as $row) : ?> 27 <tr> 28 <td><?= h($row['id']); ?></td> 29 </tr> 30 <?php endforeach; ?> 31 </table> 32 <?php else: ?> 33 <div>検索しましたが見つかりませんでした。</div> 34 <?php endif; ?> 35 </div> 36 </body> 37</html>

php

1<?php 2 3/** 4 * common.php 5 */ 6require 'config.php'; 7 8/** 9 * エスケープ 10 * @param string $string 11 * @return string 12 */ 13function h($string) 14{ 15 return htmlspecialchars($string, ENT_QUOTES, 'utf-8'); 16} 17 18/** 19 * autoload 20 * @param string $className 21 */ 22function autoload($className) 23{ 24 $filename = sprintf('%s.php', $className); 25 require $filename; 26} 27 28spl_autoload_register('autoload');

php

1<?php 2 3/** 4 * config.php 5 */ 6/** 7 * DB関連設定 8 */ 9define('DB_HOST', 'localhost'); 10define('DB_NAME', 'sample'); 11define('DB_USER', 'root'); 12define('DB_PASSWORD', 'password');

php

1<?php 2 3/** 4 * DB.php 5 */ 6class DB 7{ 8 9 private static $instance = null; 10 private $pdo = null; 11 12 /** 13 * getInstance 14 * @return object 15 */ 16 public static function getInstance() 17 { 18 if (is_null(self::$instance)) { 19 self::$instance = new self(); 20 } 21 return self::$instance; 22 } 23 24 /** 25 * clone 26 * @throws Exception 27 */ 28 final public function __clone() 29 { 30 throw new Exception("this instance is singleton class."); 31 } 32 33 /** 34 * コンストラクタ 35 */ 36 private function __construct() 37 { 38 $options = [ 39 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION 40 , PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC 41 ]; 42 43 $dsn = sprintf('mysql:host=%s;dbname=%s;charset=utf8' 44 , constant('DB_HOST') 45 , constant('DB_NAME') 46 ); 47 48 $this->pdo = new PDO($dsn 49 , constant('DB_USER') 50 , constant('DB_PASSWORD') 51 , $options 52 ); 53 } 54 55 /** 56 * トランザクション 57 */ 58 public function transaction() 59 { 60 if (!$this->pdo->inTransaction()) { 61 $this->pdo->beginTransaction(); 62 } 63 } 64 65 /** 66 * ロールバック 67 */ 68 public function rollback() 69 { 70 if ($this->pdo->inTransaction()) { 71 $this->pdo->rollBack(); 72 } 73 } 74 75 /** 76 * コミット 77 */ 78 public function commit() 79 { 80 if ($this->pdo->inTransaction()) { 81 $this->pdo->commit(); 82 } 83 } 84 85 /** 86 * SELECT 87 * @param string $sql 88 * @param array $params 89 * @param int $start 90 * @param int $limit 91 * @param array recordset 92 */ 93 public function select($sql, array $params = [], $start = 0, $limit = null) 94 { 95 $sql = trim($sql); 96 if (!is_null($limit) && 0 < $limit) { 97 $sql .= sprintf(' LIMIT %d offset %d', $limit, $start); 98 } 99 $stmt = $this->pdo->prepare($sql); 100 $stmt->execute($params); 101 return $stmt->fetchAll(); 102 } 103 104 /** 105 * UPDATE 106 * @param string $sql 107 * @param array $params 108 * @return int rowCount 109 */ 110 public function update($sql, array $params = []) 111 { 112 $stmt = $this->pdo->prepare($sql); 113 $stmt->execute($params); 114 return $stmt->rowCount(); 115 } 116 117 /** 118 * INSERT 119 * @param string $sql 120 * @param array $params 121 * @return int lastInsertId 122 */ 123 public function insert($sql, array $params = []) 124 { 125 $stmt = $this->pdo->prepare($sql); 126 $stmt->execute($params); 127 return $this->pdo->lastInsertId(); 128 } 129 130 /** 131 * DELETE 132 * @param string $sql 133 * @param array $params 134 * @return int rowCount 135 */ 136 public function delete($sql, array $params = []) 137 { 138 $stmt = $this->pdo->prepare($sql); 139 $stmt->execute($params); 140 return $stmt->rowCount(); 141 } 142 143}

投稿2017/01/21 21:51

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

taishi_574

2017/01/22 05:16

ありがとうございます。 参考にさせていただきます!
guest

0

ベストアンサー

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

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

公式PHPマニュアル

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

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

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

投稿2017/01/21 12:18

編集2017/01/21 12:36
tanat

総合スコア18706

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

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

taishi_574

2017/01/22 05:16

なるほど、これがコンストラクタというやつだったんですね。 名前は聞いたことがあったのですがいまいち理解できてなかったようです。 __constructと書き換え動作しました! 初歩的な質問にお答えいただきありがとうございました!
guest

0

phpのコンストラクタは

php

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

ではないですか?

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

投稿2017/01/21 12:15

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

tanat

2017/01/21 12:26

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

退会済みユーザー

2017/01/21 23:14

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問