今だけ人気マンガ100円♪夏の100円レンタル祭り♪

PHPでフレームワークを使う意味ってあるのでしょうか?
私的にはメリットよりデメリットのほうが多いと思っています

そもそもPHPは便利な関数が元々充実していますし、WEB上に多くの情報が存在します
フレームワーク固有の関数を探してくるより
PHPで実現するソースコードを探してくる方が速いと思うのですが

最近では珍しくないと思いますが
デザイナーもプログラムの知識を持っているチームの場合は
MVCに作業分担するメリットも感じられません

フレームワークをかませることで
不具合発生時の原因の特定も複雑になります

PHPでフレームワークを使う意味について
皆様の意見をお聞かせ下さい


メリット
・MVCに作業を分担できる
・機能が用意されている場合は作業の簡略化が期待できる

デメリット
・フレームワークに脆弱性が見つかった場合に対応が必要
・フレームワーク自体にバグが含まれている場合がある
・不具合が起きた場合に原因の特定が難しくなる
・ノンフレームワークに比べて速度は遅くなる(Phalcon等、例外は除く)
・ノンフレームワークに比べて柔軟性はなくなる(Phalcon等、例外は除く)

このQ&Aに関連する最新のQ&A

A 回答 (8件)

フレームワークを使う使わないの2択に限定する


必要はないのでは?
仮に既存のフレームワークを使わないと決めたと
しても便利な点が1つでも2つでもあったら取り入
れれば良いだけだと思います。
    • good
    • 1

MVCの最大のデメリットは


ちょっと批判すると信者にたたかれることかな

宗教みたいなもんだから、なくても困らないけど
使わないからといって利用者を批判すると戦争になります。
世の中いろんな人がいるんだねとやさしく見守ってあげましょう。

逆に利用者からして推奨したり勧誘するのはいいが
不使用者を全否定するのはカルト教徒レベル
どんなに適切で正しいことを言っていてもかかわりたくない
    • good
    • 1
この回答へのお礼

yambejp様

回答ありがとうございます

>宗教みたいなもんだから、なくても困らないけど
>使わないからといって利用者を批判すると戦争になります。

わたしの質問、フレームワーク使いを批判してるように書いてますかね
そういった意図はないです、すみません。。


>逆に利用者からして推奨したり勧誘するのはいいが
>不使用者を全否定するのはカルト教徒レベル

この手の話は、自身の主体性を保つために攻撃的に出てしまうクラスタがたまにいますね
偉い人でも。。。
私も、クリエイティブは柔軟性を失ったらおしまいだと思います。

お礼日時:2014/07/17 10:52

shylockさんの回答に概ね賛同します。

MVCに関しては…可読性・保守性の観点から、フレームワークを使わなかったとしてもせめて「デザイン」と「ロジック」の2つの分離はしておきたいところです。私はノンフレームワーク・ノンテンプレートエンジンで小物を作るときも

<?php
ロジック
?>
<!DOCTYPE html>
<html>
<body>
PHPを使うのは変数内容出力目的のみ
</body>
</html>

こういう書き方をしますね。<body></body>の中にechoする目的以外の比較的長い <?php ?> をダラダラ書くようなコードは大嫌いです。

加えて、ちょっと違う視点から回答します。Phalconに対して好印象を持てるのは実行速度だけではなく、「C言語でエクステンションを書けるほどレベルの高い人たちが作っている」という認識があるからではないのでしょうか。

・フレームワークに脆弱性が見つかった場合に対応が必要
・フレームワーク自体にバグが含まれている場合がある

つまり言うところ、こういう不安は「開発元が自分より信頼できない」というところからきているんだと思います。個人的には

「PHPインタプリタのコミッタにはなれなくても、ソースを読んで流れを追えるレベル」

これぐらいの水準のチームであれば喜んで使いたいと思えるところです。あとはちゃんとドキュメントが整備されているかどうか…とかですね。
    • good
    • 2
この回答へのお礼

To_aru_User様

回答ありがとうございます

なるほどですね
やはり「フレームワークを使えば、コミニュケーションを取れない人間も可読・保守が出来る」が最大のメリットとなりそうですね。

しかし、フレームワークを使った場合ってそんな夢のような世界が広がってるのですかね@_@
実際問題 仕様書の一部だけ見て引き継ぎって出来るんでしょうか?
実際問題 grep検索で関数を探すような泥臭いこともないんでしょうか?


>「C言語でエクステンションを書けるほどレベルの高い人たちが作っている」という認識があるからではないのでしょうか。

いえ、特定の言語を使っているから熟練者である有能である、といった考えは持っていません。
C言語使用者の中にも有能な人、無能な人はいると思います。

Phalconを出したのは単純にPHPの上に乗ったものではないからです。


>つまり言うところ、こういう不安は「開発元が自分より信頼できない」というところからきているんだと思います。

そうですね、自分が作ったものであればソースもすべて把握しているので原因が特定しやすいですが
見ず知らずの人が作ったものを全ソース理解せずに間にかませるのはとても不安になります。


じゃあ、サーバのミドルウェアのソース理解してるのか!とお叱りを受けそうですが。。

お礼日時:2014/07/17 11:19

>フレームワークをかませることで


>不具合発生時の原因の特定も複雑になります
>不具合が起きた場合に原因の特定が難しくなる
えっ?それはない。まともに実装しているならログ出力の実装しているだろうし
xdebugでそのログを元にブレークポイントを設定してステップ実行する


>デザイナーもプログラムの知識を持っているチームの場合は
>MVCに作業分担するメリットも感じられません
メンテナンス性。
デザインはこっち。DB問い合わせはこっち。などMVCで実装することによってどこを修正すればいいのかわかりやすい。

>フレームワークに脆弱性が見つかった場合に対応が必要
それ、君が作ったプログラムも同じことがいえるよね。
既存のフレームワークならこっちが気がつく前に改修されてこっちとしてはフレームワークのバージョンだけを上げるだけですむ可能性の方が高い。
それに対してすべてを君が作った場合にはすべて君が改修するんだよ。大変だね。
それと仕事を引き継ぐ場合、フレームワーク部分は読まずに実装した部分だけ読めばいい。
それに対して君がすべて実装したら引き継ぐ人はすべて読む必要があるね。大変ですね。


>・ノンフレームワークに比べて速度は遅くなる(Phalcon等、例外は除く)
速度を気にする実装ならそもそもPHPなんて使わない。Javaで実装する。
    • good
    • 0
この回答へのお礼

ahoo_ok様

回答ありがとうございます


>xdebugでそのログを元にブレークポイントを設定してステップ実行するし
>どうして特定が難しくなる?

必ずログに出力されるような行儀の良い不具合だけしか出ないんであればそれでいいんではないでしょうか
しかし、サービスを運用しているとログに出力されない不具合などザラに出てきます。

そういった場合にフレームワークも犯人として浮上するので特定が難しくなります。



>それと仕事を引き継ぐ場合、フレームワーク部分は読まずに実装した部分だけ読めばいい。
>それに対して君がすべて実装したら引き継ぐ人はすべて読む必要があるね。大変ですね。

なるほど、メンテナンスが容易になるというメリットですね。
そんなものwikiなどでもカヴァーできるし、フレームワークであっても仕様書は必要ですよね
やはりデメリットのほうが勝つ気がする。。。


>速度を気にする実装ならそもそもPHPなんて使わない。Javaで実装する。
これを議論するとパールPHP戦争のようになるので、そうですね。と言っておきます。

お礼日時:2014/07/17 10:15

>やっぱりデメリットのほうが多いですね


フレームワークを使う事に対するメリット・デメリット
だけを見て、フレームワークを使わない事によるデメリ
ットを考慮しないと意味は無いと思いますが?

>作業員の確保も困難になりますし
フレームワークの使用経験が有る作業員であれば、ある
程度のレベルは経験年数や作業内容によって想定が可能
ですが、独自のプログラム形態を採用している場合は、
外部の人間がそれに適応できるかどうかはやってみないと
分からなくなります。
そういった面ではむしろ作業員の確保は難しくなります。

フレームワークを使わない事によるデメリット
・個人毎の技量の差によってプログラムの質が大きく左右
される。
・同じ様な処理が複数の箇所で使われる事で、仕様変更や
不具合修正の際に修正漏れが発生しやすい。
それによる不具合は原因の特定が難しくなる。
・脆弱性が見つかった場合に対応が必要。
使用者の数が少ない為、脆弱性を見つける機会が限られる。
そもそも十分な脆弱性に対する対応が行われているか保証
されていない。
・バグが含まれている場合がある。
    • good
    • 0
この回答へのお礼

don_go様

回答ありがとうございます


>フレームワークの使用経験が有る作業員であれば、ある
>程度のレベルは経験年数や作業内容によって想定が可能

なるほど、そういった側面から見るのも面白いですね。
しかし、残念ながら「フレームワーク使用経験=熟練者」という式は成り立ちません
GETとPOSTの違いも理解していないcake使いもいます。


>フレームワークを使わない事によるデメリット

ありがとうございます。
こういった意見を待っておりました。

お礼日時:2014/07/17 10:34

MVCを理解していない人は容赦なくチームから外します。


理由は#2の回答の方とお同じ。
それくらいフレームワークのメリットは大きい。
    • good
    • 0
この回答へのお礼

kosukejlampnet様

そうですか、かわいそうですね。。

お礼日時:2014/07/15 17:35

特に不自由を感じないのであれば、使う必要はないと思います。

おそらく、自分で管理できる程度の規模のものしか作っていないということではないでしょうか。ある程度小規模であればフレームワークの優位性はあまり感じられないと思います。


例えば、相当に大掛かりな規模のWebサイトを考えてみてください。

数ヶ月をかけて実装し、ようやく本番近くにまでこぎつけました。

そしたら、クライアントの鶴の一声、「データベース変えてくれ」

はい、どうしましょう?

データベースにアクセスするページは数十、数百、ヘタすると数千ページ。どう対処します?

フレームワークであれば、「しょうがねえな」と思いつつ設定変更してDAO見なおしておしまい、です。


あるいは、いきなり仕様変更。データベースの構造が変わりました。

はい、どうしましょう?

全部手書きで作っていたら、データベースアクセスしている部分のSQLをすべて書き直し。数百、数千あります。全部書き終わったら、おそらく数えられないほどのバグが混入してます。

フレームワークであれば、「しょうがねえな」と思いつつモデルの設計を書き直し、DAO書きなおしておしまい、です。


まぁ、他にもいくらでも出てくるでしょうが……。

大掛かりな開発になると、開発の時点であちこち仕様変更があるのが当たり前。そして作ったものはその後何年もメンテナンスすることになります。2年後、3年後、検討の末にSQLサーバーを置き換えました、クラウドに移行になります、といった大規模な変更もあるでしょう。

こうしたとき、すべてあちこちから切り貼りしたコードで組み立てていた場合は、おそらく一から作り直しに近い事態になるかも知れません。が、フレームワークを導入していれば、必要最小限の変更で済みます。
    • good
    • 0
この回答へのお礼

shylock様

お答えありがとうございます
なるほどですね!

データベースに関しては、仕様変更の恐れがあるのであれば
DAOにあたるものをclassで自作すればいいんじゃないかと思いましたが
5人程度のチームであれば自作したクラスも口頭によるコミュニケーションで周知可能ですが
数百人規模であればそれは不可能ですもんね、そういう場合は確かにフレームワーク使ったほうがいいですね

しかしオラクル固有の機能をふんだんに使っているのに、突然ポスグレにしてくれと依頼された時は
例えフレームワークを選択していても簡単には対応出来ないですよね?

余談ですが
Facebook、アメーバピグ、LINEなども数人のチームから始まっていますが
WEBサイト・サービスで数百人規模のプロジェクトってどんなものがあるんでしょうね
↓こういうのとかでしょうか
http://www.touki-kyoutaku-net.moj.go.jp/

未知の領域です

お礼日時:2014/07/15 17:33

メリット


・そのフレームワークを熟知したプログラマが作業すれば開発工数が格段に少なくて済む

デメリット
・フレームワークを熟知していなければ格段に開発工数が増す
    • good
    • 1
この回答へのお礼

t_ohta様

はい、作業員の確保も困難になりますし
やっぱりデメリットのほうが多いですね

お礼日時:2014/07/15 16:12

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QPHPフレームワーク環境でのSmartyの必要性

PHP でシステムを開発する際ですが、恐らく何かしらのフレームワークを利用した場合は大半だと思います。そう言った時にテンプレートエンジンの Smarty を合わせて利用するかどうか意見が別れる時があります。

PHP でフレームワークが今ほど使われていなかった大昔は、素の PHP 実装 + Smarty で、ロジックとテンプレートを分離する流れがありました。
しかし、現在利用されるほとんどのフレームワークでは当たり前のように MVC の思想で構成されており、ロジックとテンプレートは初めから分離されています。

そう言った状況の中、Smarty を各フレームワークと連携してテンプレートエンジンとして利用する必要がどれほどあるのか、判断に苦しみます。

皆さんはどう考えるでしょうか?

Aベストアンサー

そもそも、CakeやZend Framework、Fuelなどほとんどのフレームワークが、設計コンセプトにおいて、Smartyの存在を無視している以上、あえて過去の遺物を引きずる必要はないです。
Smartyはテンプレートエンジンですらない、単なるタグパーサであり、モダン・フレームワークのアーキテクチャに合いません。
最新のMVCであるLaravelなどは、自前でBladeというテンプレートエンジンを装備していますし、WordpressのようなCNSでもSmartyは用なしです。

Smartyを採用したがるのは、開発をレガシーphpの手法に引き戻して、何とか仕事を自分たちの手の届く範囲に止めたい、オールドデベロッパーの悪アガキに思えます。

Qillegal string offset

php5.3では動いていたプログラムをphp 5.4 で動かしたらwarning illegal string offsetが出て困っています。以下のプログラムでwarningが出ないようにするにはどのようにコーディングすればよいのでしょうか?


$a = array('exists' => 'foo');
if ($a['exists']['non_existent']) {
print 1;
}
print 2;
exit;

Aベストアンサー

isset()を使えばいいと思います

Qテーブルの最後(最新)のレコードを抽出したい

宜しくお願いします。
PHP MYSQL の組み合わせで使っています

以下のようにして、最後のレコードを取り出したいのですが
まったく違う事をしているのかもしれません。

$sql =" select * from テーブル where フィールド='max' " ;

フィールドはauto_incrementで番号を振っています。
これで最大のつもりなのですが・・・。

他にも、レコードを入れた時間も記録したフィールドがあるのですが
どうしてよいか?判りません。

テーブルの最新のレコードを出したいのです。
**その中の一つのフィールドを取り出すのですが、
  それはうまくいっているみたいです 
  (max の所に数字を入れると表示します)

お手数かけますが、どなたかご教授お願いいたします。

Aベストアンサー

#2回答者です。

MySQL 4.1以前(サブクエリを使えない)なら、以下のような方法が考えられます。

select * from 表名
order by 列名 desc limit 1

Q文字列から、特定の文字を削除したい

アンケートで入力された値を受け取り、メールで送信しているのですが、受け取った値から、特定の文字列を削除することは可能でしょうか?

例えば電話番号の入力の場合、
03-xxxx-xxxx →03xxxxxxxx
077-xxx-xxxx →077xxxxxxx
のように、-(ハイフン)が入力されていたら、-を削除した文字列に置換してメール送信したいのです。
入力する時に、3つのテキストエリアに分けるのは諸事情でできないので、特定の文字を削除する関数か処理方法がありましたら、教えていただきたいです。
よろしくお願いします。

Aベストアンサー

str_replace
http://itbtech.itboost.co.jp/man/php_man/function.str-replace.html

<?php
$orig_telno = "03-xxxx-xxxx";

$telno = str_replace("-", "", $orig_telno);
echo $telno;

03xxxxxxxx

“PHP 文字列” あたりをキーワードに検索すれば
そんなに難しいものでもないような。

QDBエラーの意味

フォームからDBにデータ挿入しようとすると

Column count doesn't match value count at row 1

というエラーが出てしまいます・・・どういう意味を持ったエラーなんでしょうか?

Aベストアンサー

カラム数と値の数が合わない、と言う事です。簡単な英語なので覚えましょう。
カラム数が4つにもかかわらず、
"INSERT INTO tablename VALUES (1,'hoge',3)"
とやった場合等に出るエラーだと思います。

Qforeachで回った数を表示したい

単純な質問ですみません。
====
//getTestlistは別ファイルで定義済み。
<?
$testlist=getTestlist();
foreach($testlist as $test){
?>


<? } ?>
====
例えば↑こんなふうにforeachで$testlistが存在するだけ回したとします。
そのときに何回まわったか?($testが何件あったか?)だけを表示したいのですが、そんなことってできますか?
表示したい位置は<? } ?>の外側にと考えています。
あさってな質問でしたらすみません。
phpVer 4.3

よろしくお願いいたします。

Aベストアンサー

<?
$testlist=getTestlist();
$n=0;
foreach($testlist as $test){
$n++;
?>
<?}?>

<?=$n?>回
とかでよいかと思います。

途中でbreakなどが無ければ
<? echo count($testlist) ?>でも良いかも知れません。

Q「いずれか」と「いづれか」どっちが正しい!?

教えて下さいっ!
”どちらか”と言う意味の「いずれか」のかな表記として
「いずれか」と「いづれか」のどちらが正しいのでしょう???

私は「いずれか」だと思うんですが、辞書に「いずれか・いづ--。」と書いてあり、???になってしまいました。
どちらでもいいってことでしょうか?

Aベストアンサー

「いずれか」が正しいです.
「いづれ」は「いずれ」の歴史的かな遣いですので,昔は「いづれ」が使われていましたが,現代では「いずれ」で統一することになっていますので,「いずれ」が正しいです.

Qの意味を教えてください。

Javascriptを見ていると
<a href="#" onClick="new_open();return false">
なる記述がありますが、
この<a href="#"
の部分の意味を教えてください。
<a herf まではわかるのですが、この#はどのようないみなのでしょうか?

Aベストアンサー

href="#" というのは「そのページの最上部へのリンク」という意味で、スクロールした場所から一番上に戻したい場合に使います。
ちなみに、同ページ内への # 指定でのリンクでは、ページは読み込まれずスクロールするだけです。

<a href="#" onClick="new_open();return false">
というのは、そのリンクがクリックされた時に new_open という関数を実行し、他の処理はするな、という意味です。
return false というのが、A タグ本来のジャンプ動作をキャンセルさせるためのもので、これを取ってしまうとページ最上部にジャンプしてしまいます。

このスクリプトを書いた人は onClick だけが必要だったのでしょうが、href がないとリンクの下線が出ないなどの不都合があるため、やむなく # を書いたのでしょう。

JavaScriptの内容を実行したいだけなら、
<a href="javascript:new_open()">
と書けば十分なのですが、一部のブラウザではこのタイプのリンクをクリックすると、アニメーションGIFが止まってしまうなどの弊害があるため、嫌う人もいるようです。

また、JavaScriptが有効でない環境の人は、質問に書かれたリンクをクリックしてもページ最上部に戻されるだけで、開くべきページの内容を見ることができません。
なので、
<a href="ページのURL" target="_blank" onClick="new_open(); return false">
とするなどして、非JavaScript環境にも対応した方が親切です。

長文失礼しました。

href="#" というのは「そのページの最上部へのリンク」という意味で、スクロールした場所から一番上に戻したい場合に使います。
ちなみに、同ページ内への # 指定でのリンクでは、ページは読み込まれずスクロールするだけです。

<a href="#" onClick="new_open();return false">
というのは、そのリンクがクリックされた時に new_open という関数を実行し、他の処理はするな、という意味です。
return false というのが、A タグ本来のジャンプ動作をキャンセルさせるためのもので、これを取ってしまうとペー...続きを読む

QFORMで送信ボタンと戻るボタンを2つつけてそれぞれ遷移先を変えたい

  
以下のような画面を作りたいのですが↓

--------------------------------------------------------------------------------
● a.php (ユーザ情報入力画面) ※フォームに入力する画面
 
 <FORM method="POST" action="b.php">
  <INPUT type="text" name="mail">
  <INPUT type="submit" name="submit" value="確認">
 </FORM>

● b.php (ユーザ情報入力確認画面)※フォームに入力された値を表示する画面

 <FORM method="POST" action="c.php">
  <!-- ここには、フォームに入力された値を表示する -->
  <INPUT type="submit" name="submit" value="登録"> // c.php に遷移する
  <INPUT type="submit" name="submit" value="戻る"> // a.php に戻る
 </FORM>

● c.php (完了画面)
--------------------------------------------------------------------------------
b.php について質問なのですが、
b.phpにおいて、登録ボタンと戻るボタンを2つつけて、
それぞれ遷移先を変えたいのですが、どうすればいいんでしょうか・・・?
<FORM method="POST" action="c.php">と書いてしまうと、
戻るボタンを押しても戻らずに、c.phpに遷移してしまいますよね??
こういう場合ってJavaScriptとかで遷移先を指定するんですか・・?
もしそうでしたら、JavaScriptがよくわからないので
できればサンプルコード示していただけると助かります・・・。
  

  
以下のような画面を作りたいのですが↓

--------------------------------------------------------------------------------
● a.php (ユーザ情報入力画面) ※フォームに入力する画面
 
 <FORM method="POST" action="b.php">
  <INPUT type="text" name="mail">
  <INPUT type="submit" name="submit" value="確認">
 </FORM>

● b.php (ユーザ情報入力確認画面)※フォームに入力された値を表示する画面

 <FORM method="POST" action="c.php">
  <!-- ここには、フォームに入...続きを読む

Aベストアンサー

はじめまして。

<INPUT type="submit" name="submit" value="登録" onClick="form.action='c.php';return true">
<INPUT type="submit" name="submit" value="戻る" onClick="form.action='a.php';return true">

でいいと思います。(実際、このコードで使っています)
値を渡すには、FORM内にhiddenで、値を設定しておいて、methodをPOSTに設定しておけば、渡せます。

QGROUP BYを行った後に結合したい。

oracle8iを使用しています。
2つのテーブルを結合したいと思っていますが、
テーブル構成が、N対Nのテーブルのため、
片方をグループ化したあとに結合させようと思っています。

ところが、単純にGroup byを使うと、結合した後に
グループ化してしまうために、期待した値がひょうじされません。

なんとか、1回のSQLで正しく情報をとることはできないものでしょうか。

Aベストアンサー

>テーブル構成が、N対Nのテーブルのため、
>片方をグループ化したあとに結合させようと思っています。

多分こんな形ではどうですか?

SELECT A.KEY,B.KEY,
FROM TABLE_A A
,(SELECT KEY FROM TABLE_B
GROUP BY KEY) B
WHERE A.KEY=B.KEY;

要はFROM句にテーブル名ではなく、SELECT~GROUP BYを書く。


人気Q&Aランキング