よくデータベースに接続する際に
db_connect();
った関数を作るのをよく目にします。
これはなぜわざわざ関数にして使用するのでしょうか?
複数のデータベースに接続することを目的にしているのでしょうか?それともまた別の意味があるのでしょうか?
ご解答宜しくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答6件
0
ちょっと使用状況が分かりませんが、一般的なプログラミングを考えると、多分見通しの良さを求めていると考えられます。
プログラミングのコツに、分かりやすいコードを書くことがあげられますが、その一つが見通しの良さです。
コードの本筋を見決めやすくするため、機能を最小単位に分割し、それを関数等で実装、必要な箇所で呼び出すことで、本筋を見失わず、必要な機能を実行させます。
そうすると、本筋はわかりやすく、また最小単位に分割することで、デバッグもしやすくなります。
また、今後、作っていくシステムが大きくなると、db_connect() といったデータベース接続のための関数を自分で作る機会は減ります。
これは、フレームワークで実装したり、ライブラリとして、プログラムの本筋から分離/分割されるからです。
この時点で、見通しの良さに加えて、再利用性も向上します。
多分、参考にされているコードは、一番に見通しの良さ、二番に再利用を視野に入れたそういったコードになっているんだと思います。
投稿2017/01/10 00:38
退会済みユーザー
総合スコア0
0
ベストアンサー
ただ疑問だったのがよくdb_connect()で関数を作りそのファイルを冒頭でrequireして表示させている例をよく見たのでそもそもがそれだけをrequireするのであればそもそも関数にする必要性がないのでは?
require の機能というより、関数にすることによるメリットがわからないということのようですね。
関数化によるメリットは、変数のスコープを理解していなければなりません。
php
1<?php 2 3// グローバル空間に定義した変数 4$var = '';
このようにグローバル空間に定義した変数は、ファイルが読み込まれていれば、どこからでもアクセスできます。またどこからでも変数に代入することができるので、値を書き換えることができます。
このことは、require されたファイルに定義された変数であっても同じです。
以下の例。
php
1<?php 2/** 3 * index.php 4 */ 5require 'required_file.php'; 6 7$var = 'a';
php
1<?php 2/** 3 * required_file.php 4 */ 5$var = array(1, 2, 3);
この例で、PHPにおいては、なんのエラーもなく実行可能です。index.php のファイルを見る限り、$var に対し、新たに変数を定義したつもりであっても、required_file.php で何か重要な働きがあるはずの、$var に対しなんのチェックもなく、値を書き換えてしまうことが可能です。このことは、思いも寄らないバグを引き起こしてしまうリスクを伴います。
規模の大きなシステムにおいては、require されるファイルも多くなり、require されたファイルの先でまた require されるということもあり得ます。そうなると、とても把握しきれるものではありません。
そこで、function を利用することにより、この意図せず 変数を書き換えてしまうというバグを防ぐことができるようになります。
php
1<?php 2 3require 'required_file.php'; 4 5$var = 'a'; // ここで定義した $var は func() 内の $var に影響を与えない。 6var_dump($var); 7 8var_dump(func());
php
1<?php 2/** 3 * required_file.php 4 */ 5function func(){ 6 $var = array(1, 2, 3); 7 return $var; 8}
投稿2017/01/12 06:28
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/01/12 06:49
0
データベースへの接続を関数化するのは、開発する人により色々な意味を持っている
と思うので、一つの例として回答します。
データベースサーバのIPアドレスや接続するユーザ名、パスワードが変更された
場合、db_connect()関数だけを修正すれば済みます。
接続情報が外部ファイルに設定されている場合でも、その読込方法等を変更したい
場合も関数以外の部分に影響ないように考えての関数化だと思います。
DBの変更が予定されていない場合でも、汎用化や将来性を考えて関数化するのでは
ないでしょうか。
投稿2017/01/10 00:38
総合スコア91
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
DB接続に限らず、関数化する目的はたいてい「コード整理、見通しのよさ」と「再利用性のアップ」だと思います。
(※もっと言えばその目的でクラスがありますが、とりあえず今はクラスは無視します)
関数としてまとめておけば、繰り返し同じことを書かなくていいし、もしその処理部分を変更しようと思ったら一箇所修正するだけで済みます。
たとえば一つのサイトで一つのPHPファイルしか使わないなら、関数化の恩恵は少ないでしょう。
でも複数のファイルがあって、それぞれがDBに接続するとしたら? いちいち全ファイルにDB接続の処理コードを書くのは無駄だし、修正時に全ファイルを修正するのも手間です。
そういうときにdb_connect()という関数をつくり、別ファイル(function.phpとか)にしておけば、必要なときにrequireやincludeなどして「共通部品」として使えるようになります。
投稿2017/01/10 01:46
総合スコア907
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/12 05:37
2017/01/12 05:59
2017/01/12 06:36
2017/01/12 06:49
0
例えば定期的にDBのパスワードを変更しなければならない場合、
PHPの各ファイルにDBのパスワードや接続先を書いていたりすると、全てのファイルを書き直さなければならなくなります。
このように、繰り返し使う同じ処理は1回しか書かないようにし、メンテナンスを容易にするのが鉄則です。
投稿2017/01/12 05:55
総合スコア726
0
http://dolem.jp/?m=builtin_function
そういう関数があるから?
投稿2017/01/10 00:04
編集2017/01/10 00:07総合スコア2050
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/01/10 00:43
2017/01/12 05:40
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/12 05:37
退会済みユーザー
2017/01/12 05:47
2017/01/12 06:43
退会済みユーザー
2017/01/12 07:07