【PHP】下らねぇ質問はここに書き込みやがれ 23
■ このスレッドは過去ログ倉庫に格納されています
0001909
2006/06/23(金) 01:59:03ID:lPdqGX0Zここなら本スレで回答のないお前の下らない質問に回答があるかも知れません。
まず読め【PHP マニュアル】
http://www.php.net/manual/ja/
過去スレは>>2
0281nobodyさん
2006/06/27(火) 20:53:17ID:???リンクを示すなら、こっちだろ
http://allabout.co.jp/internet/database/closeup/CU20050320A/index.htm
修正したphp.iniが本当にPHPの設定に反映されるものなのか確認
例えば手順にある「magic_quotes_gpc = Off」をOnにしてみて
phpinfoで変わっているか。あと手順「6. DLLのコピー」の抜けはない?
0282nobodyさん
2006/06/27(火) 21:17:03ID:???WindowsXP Proです
>>281
magic_quotes_gpc = Offに変えて、ApacheをRestartしても変化なしです。
一度Stopさせたほうがよいのでしょうか
0284nobodyさん
2006/06/27(火) 21:20:28ID:???手順6の作業が抜けていたので、system32にコピーして
Apacheを再起動させましたが、まったく変化がありません
0287278
2006/06/27(火) 21:28:33ID:???http://www.uploda.org/uporg428225.txt
0288nobodyさん
2006/06/27(火) 21:30:40ID:???それでちゃんと正しいところを指してるとは思うけど
(ロード出来なかったらエラー出てる筈だから)
念のためダブルクォートで括ったドライブ名から書いたフルパスにしてみ。
0290278
2006/06/27(火) 21:38:48ID:???作成したDBを直で見たいときは、どのソフトを使えばよいのでしょうか
MySQLはAccessでは無理なんでしたよね
0291nobodyさん
2006/06/27(火) 21:45:37ID:792aro1Jあるとすればそれはどんなことでしょうか。
0293nobodyさん
2006/06/27(火) 21:49:43ID:792aro1Jありがとんこつラーメン(・∀・)
0294nobodyさん
2006/06/27(火) 21:49:57ID:???orz
0295nobodyさん
2006/06/27(火) 21:51:33ID:???0296nobodyさん
2006/06/27(火) 21:53:20ID:???これはシェアなのでしょうか。
0297nobodyさん
2006/06/27(火) 21:57:44ID:???if (is_under12($man)) die('早すぎます><');
if (has_wife($man)) die('離婚すればいいよ^^');
if (has_H($man)) die('貴様は二次元で十分');
if (is_impo($man)) die('人生\(^o^)/オワタ');
return get_woman($man);
}
function get_woman($man) {
$woman; $rnd = mt_rand(0, 10);
switch ($rnd) {
case 2 :
$woman = "エルメスたん";
break;
case 3 :
$woman = "細木数子";
break;
case 5 :
$woman = "HG";
break;
case 6 :
$woman = "インリン";
break;
case 8 :
$woman = "泉ピン子";
break;
case 9 :
trigger_error('彼氏のモトカノのモトカレ');
break;
default :
$woman = null;
}
}
0298nobodyさん
2006/06/27(火) 22:07:53ID:???いや、昔は日本語対応なんてしてなかったよ。
294のは日本語対応されたので、私家版の配布を止めます宣言
つか古い話だよなw
0300nobodyさん
2006/06/27(火) 22:20:28ID:???俺に振るのかw
config.default.phpをベースに変更して、自分用のconfig.inc.phpを作る。
最近ので実験版とかじゃないやつは、installユーティリティが入ってて
それで自分用のconfig.inc.phpを作ることも出来る。
バージョンで差異があるので、自分の入手したもののドキュメントをあたれ。
0301nobodyさん
2006/06/27(火) 23:09:21ID:???いえいえ、詳しそうなので^^;
使ってみたのですが、まったく使い方がわかりませんね(笑
とりあえず$cfg['DefaultLang'] = 'ja';にしたのですが、日本語にならないですしorz
0302nobodyさん
2006/06/27(火) 23:09:50ID:???サブドメインの場合はsession.cookie_domainでできるみたいですが、
example.jpとexample.comとexample.netとauau.infoで共有する方法を探しています。
宜しくお願い致します。
0303nobodyさん
2006/06/27(火) 23:10:19ID:8VAiAYdr3で別ファイルに記録しています。
アクセスログを全部見るまではしませんが、
特定のアクション(ボタン押し下げ等)をした時のIPなどを
記録したいと思いまして。エラー処理ではないのですけど。
0304nobodyさん
2006/06/28(水) 00:00:34ID:5cOrr7Idもう少し正確に言うと、include したファイル内で定義された関数の取消というか。
同じファイルを複数回 include したいのですが、そのファイルの中で関数定義があるため、二度目の include でエラーになってしまいます。
さらに悪いことに、include されるファイルは数種類あり、それぞれのファイルの中で同名の関数が定義されていることもあります。
その include されるファイルというのは画面のテンプレートになっていて、メインのスクリプトでは決まった変数にパラメータをセットしておき、
画面テンプレートを include することにより、画面出力を行うという仕組みになっています。
画面出力と言っても、それは HTMLファイルに出力するようになっています。
メインのスクリプトは大量のHTMLファイルを作成するスクリプトで、数種類の画面テンプレートを何度も include して、その結果をファイルに落とし込む処理をしています。
で、画面テンプレート内に固有の関数定義をした場合に、include が失敗するという問題に突き当たってしまったというわけです。
今は実験的に、関数定義を if(function_exists(〜)) の trueパートに置くことにより二重定義を避けていますが、別ファイルに同じ関数名があるようなケースに問題があります。
全ファイルを通して関数名をユニークにするという案もあるかと思いますが、ひとまずそれ以外の方法があればそれを知りたいです。
0305304
2006/06/28(水) 00:05:07ID:???○ 関数定義を if(!function_exists(〜)) の trueパートに置くことにより
0306nobodyさん
2006/06/28(水) 00:13:30ID:???悩むべきポイントを大幅に間違ってるような気がする。
やろうとしてることはだいたいわかったが、説明するより直接手加えた方がはやそうなんで
実物の骨組みをここに貼り付けてくれ。或いはソースをまとめて、どっかにウプしてくれ。
0307304
2006/06/28(水) 00:29:21ID:???main.php
$resource=InitResource(); // 出力ファイル名、画面テンプレート名、パラメータなどを求めるための何らかのリソース
while(($params = GetParameters($resource)) !==false) {
StdoutToFileStart($params['outfile']); // 標準出力をファイル化する処理開始(独自関数)
include $params['template']; // $param内に設定された様々な値を利用するファイル
StdoutToFileEnd(); // ファイル化終了
unset($param);
}
0308304
2006/06/28(水) 00:32:47ID:???template1.php
<html>
<table border="1">
<tr><td>ID</td><td>名前</td></tr>
<? foreach($param['data'] as $rec) { ?>
<tr><td><?=$rec['id'];?></td><td><?=hoge($rec['name']);?></td></tr>
<? } ?>
</table>
</html>
<? // 固有関数定義
function hoge($str)
{
// 固有処理
return $result;
}
?>
0309304
2006/06/28(水) 00:35:16ID:???include される画面テンプレートは tenplate1.php のような感じで、ここでは固有関数 hoge を定義しています。
実際はもうちょっと複雑な処理で、しかも画面テンプレート毎に固有で、標準化しづらい内容のものになっています。
で、画面テンプレートはどんどん増えていきます。
どんどん増える都合、関数名をユニークにするなどの処置は管理上の問題が出てきまして、できれば避けたいのです。
0311nobodyさん
2006/06/28(水) 00:57:54ID:???抽象クラス一個作って継承すれば?
インクルードの取り消しとかぜってーごちゃごちゃする気がするんだけど
ちなみに取り消しができるかどうかは俺は知らね
0312304
2006/06/28(水) 01:02:15ID:???クラスにしても二重定義の問題は出るかと思いますが、そんなことないですか?
名前無しの即値クラスみたいなものが使えたりします?
0313nobodyさん
2006/06/28(水) 01:08:49ID:???できない
>>303
関数名にとらわれ過ぎ
parse_ini_file()でもiniファイル以外を開いていいんだよ
>>304
できない
というか、プログラムの基本構造の組み立て方が間違ってる
1.機能が違うのに同名の関数がある→関数名の名付け方がおかしい
2.機能が同じで同名の関数がある→関数の割り振り方がおかしい
1なら素直にリネーム
2ならそういう関数を別ファイルにしてinclude
一番いいのはクラス化すること(PHP4以上)
0315304
2006/06/28(水) 01:19:50ID:???同じファイルを二度 include することがあるからです。
>>313
最終的にはリネームすることになると思うのですが、まずは他の方法を模索したいところです。
名前ばダブらないように管理するということを、できればしたくないからです。
スコープがファイル内だけの関数定義ができるとか、Javaの無名クラスみたいのが作れるとかがあればいいんですけどね・・・
多少トリッキーでも、何かいい方法は無いものですかね。
ちなみに関数名って、MakeTree とか MakeTable みたいなありがちな名前で、でもその実装はテンプレートによって微妙に違うという、困った状況になってます。
0316nobodyさん
2006/06/28(水) 01:20:51ID:???0318nobodyさん
2006/06/28(水) 01:47:53ID:???0319311
2006/06/28(水) 01:49:58ID:???何で継承してんのに多重定義になるの?そこはクラス名変えろよ。
さっきも言ったけどトリッキーなのはやめといた方が無難な気がする。
>>317
別ファイルに同名関数があるんだってさ
ブラジル猛攻
0320nobodyさん
2006/06/28(水) 01:57:02ID:???include_once は、二度目以降テンプレートの中身が出力されなくなるのでダメです。
・同じファイルを二度以上 include する必要があり、
・その中身は include されるたびに評価される必要がある
という条件になります。
>>319
同じファイルを二度 include する必要があるという点を考慮していただけないでしょうか。
異なるファイルを一度ずつ include するなら、ファイル間でクラス名を変えればいいというのは正解ですが。
0321317
2006/06/28(水) 01:57:06ID:???基礎というか組み立て方が分かってないのね
把握した
>>304
ファイル毎に機能を振り分けて図に書いて整理してみるといいよ。
プログラムなんて積み木みたいなもんだから、ちゃんと組み立てればそれなりのものができるけど、
全体を把握せずにガンガン積み上げていったら一気に崩壊するよ。
0322317
2006/06/28(水) 02:02:30ID:???>>320
自分もinclude_once使ってるけど、
>二度目以降テンプレートの中身が出力されなくなるのでダメです。
こんなコトになったことはないよ。
include_onceでテンプレートファイルをそのまま出力してるクチかな?
0323304
2006/06/28(水) 02:03:41ID:???>>321
関数ライブラリを作って include しようって話ではなく、画面テンプレートを include により出力しよう、というのが今回のテーマです。
画面テンプレートは、プラグインのようなイメージで勝手に追加できる、という感じにしたいのです。
そのため、テンプレートの作者間で意思疎通をしない限りは、関数名がダブるという事態が発生してしまうのです。
命名規則として、テンプレートファイル名に等しいプレフィックスを関数名につける、等のルールを設定することもできますが、
できれば余計なルールを設けないような選択肢があるのならそちらを採りたいと思った次第です。
0324304
2006/06/28(水) 02:06:35ID:???あれ、>>308 のようなファイルを include_once したとき、二度目の include_once でこの HTML の内容って出ますか?
出ないと思ってたのですが、勘違いかも。
ちょっくら実験してきます。
ちなみに、include で標準出力に出力されるべき内容を、出力バッファハンドラを設定することによりファイルへ書き込む、という処理をやってます。
0325304
2006/06/28(水) 02:10:18ID:???test.inc というファイルに
TEST1
という内容を書込み、
<?
include_once 'test1.inc';
include_once 'test1.inc';
?>
とやっら、
TEST1
と一行だけ出力されました。
残念ながら、これじゃダメなんです。
0326nobodyさん
2006/06/28(水) 02:19:47ID:???前後の話は読んでない。
そりゃinclude_onceなら一行(一回)しか実行されないよ。
両方実行したいなら普通のincludeでやってみれみれ
0327nobodyさん
2006/06/28(水) 02:19:58ID:???>>322が
> include_onceでテンプレートファイルをそのまま出力してるクチかな?
って書いてるじゃない。つまり、322は>>308みたいなHTMLは使ってない。
多分、関数か変数に代入したデータが書かれてて、それを実行してる。
includeする内容に直にHTMLが書かれてて何度も出力が必要な場合はonceは使わない。
>>315
> スコープがファイル内だけの関数定義ができるとか
こういうのはどう?
template1.php
<? // 固有関数定義
$funcparam = '$str';
$funcbody = '
// 固有処理
return $result;
';
$funcname = create_function($funcparam, $funcbody);
?>
<html>
<table border="1">
<tr><td>ID</td><td>名前</td></tr>
<? foreach($param['data'] as $rec) { ?>
<tr><td><?=$rec['id'];?></td><td><?=$funcname($rec['name']);?></td></tr>
<? } ?>
</table>
</html>
0329nobodyさん
2006/06/28(水) 02:22:22ID:???一体何様なんだ、こいつはww
0330nobodyさん
2006/06/28(水) 02:25:39ID:???テンプレートファイルに名前ついてるだろ?それが固有の識別子になってるのに、
なんでclass化するなりして名前空間を指定しないでglobalに放り込んでるんだ????
template1.php → class template1 で全部解決するやん
0331317
2006/06/28(水) 02:27:20ID:???フォローありがと
>>325
それ、テンプレートとPHPが1つのファイルに混ざって書いてあるのね。
>>308の方は見て無かったよ。ゴメン
HTML部分とPHPの関数部分を切り離して、HTMLはincludeで何度も出力、
PHP関数部分はsubroutine.phpとかにでも移してinclude_onceで読み込むのがいいと思うよ。
0332nobodyさん
2006/06/28(水) 02:27:39ID:???0333nobodyさん
2006/06/28(水) 02:27:59ID:???よし、俺様がまともな解決法を教えてやるよ!
これでも使っとけ!
拡張組み込む必要はあるが、お前のやりたいことがそのまま叶うからな!
http://www.php.net/manual/ja/function.runkit-function-redefine.php
じゃ、もう二度と来るなよ!
0334nobodyさん
2006/06/28(水) 02:30:33ID:???もうちょい言うなら、それに加えてテンプレートと中で使う固有処理はファイルを分けて、
template1.php
<?php
require_once("template1func.php");
?>
<html>
:
</html>
template1func.php
<?php
function template1() {
固有処理
}
?>
として、template1.phpはrequire()で読み込む、って感じで
require()とrequire_once()をちゃんと使い分けるべきなんだよね。
0335nobodyさん
2006/06/28(水) 02:36:14ID:???0336nobodyさん
2006/06/28(水) 02:36:33ID:???0337304
2006/06/28(水) 02:36:54ID:???create_functin なんてものがあるんですね!
長い関数になると少々厳しそうですが、名前のダブリを心配しなくていい方法として大変有力ですね!
でもこれ、同じ引数で複数回呼び出したときって、同じ内容の別名の関数がどんどんできていくのでしょうか?
リファレンスをちょっと見た範囲では、特に寿命について書いてあるわけでもなく、また関数を削除するアクションについても
書いてないので、スクリプトの実行が終了するまでメモリに留まるんでしょうね。
戻り値が「関数オブジェクト」みたいなものなら良かったんですけどね・・・
さらに >>333
runkit_function_redefine なんてのがあるのですか。
というか、runkit_function_remove なんてのがあるんですね!
これが正解な気がしますね!
ただ、runkit の使い方について不勉強なもので、ターゲットの環境で使えるかどうか不明なのがナニです。
とりあえず実験してみます。
なんにしても、新しい材料が手に入ったので、何かいい実装方法があるか検討してみます。
ありがとうございました。
0339nobodyさん
2006/06/28(水) 02:39:17ID:???いや、いいけどね。
0340nobodyさん
2006/06/28(水) 02:39:48ID:???0341nobodyさん
2006/06/28(水) 02:43:09ID:???0342nobodyさん
2006/06/28(水) 02:44:09ID:???template.phpをtemplate.class.phpに書き換えるスクリプト一つ用意すれば何もしなくても解決できる・・・
そもそもtemplateに関数定義とか入ってる時点でtemplateじゃないと思うし、分離すりゃいい・・・
標準出力使う理由も不明・・・
なんか、ものすごく間違った覚え方したまま成長しちゃって取り返しが付かなくなってる感じ。
手軽さとか利便性とか分かりやすさを重視するため!って思いこんでるだろうけど、
あんたの考え方さえ変わればすぐに手軽で分かりやすいシステムになるよ。
自分がその作業の一番のボトルネックだって認識するところからはじめるべき。
0343304
2006/06/28(水) 02:44:19ID:27YOZKQj関数名(あるいはクラス名)がユニークになるようなルールを定めて実践しろというのも正解だとは思いますが、
今回の意図としては、どちらかといえば関数名のダブリを避けるというよりは、関数のプライベート化という方が近いので、
関数エントリの削除という手段が正解だと判断したものです。
0345nobodyさん
2006/06/28(水) 02:45:41ID:???クラスって聞いたことない?
>関数エントリの削除という手段が正解だと判断したものです。
みんなそれが間違ってるって指摘してんのに、一人固執してるから進まないんだよ
0346nobodyさん
2006/06/28(水) 02:47:59ID:???> でもこれ、同じ引数で複数回呼び出したときって、同じ内容の別名の関数がどんどんできていくのでしょうか?
まぁ、そうだね。多重生成を防止する方法はいくらでもあると思うけど。
0347nobodyさん
2006/06/28(水) 02:48:14ID:???0348nobodyさん
2006/06/28(水) 02:48:50ID:???0349nobodyさん
2006/06/28(水) 02:51:51ID:???自分で一から作ったやつじゃなくて他人が作ったのが回ってきたんだろ。
で設計思想はそのまま引き継ぐ必要があるんだよきっと。
0350nobodyさん
2006/06/28(水) 02:54:04ID:???好きなようにさせてやればいいんだよ。
正しい方法を自分で選べるやつは、あんな方法とらないし
聞く耳持たないバカには何言っても無駄。
0351nobodyさん
2006/06/28(水) 02:54:36ID:???ってことを奨励する混沌とした弱肉強食システム。
0352nobodyさん
2006/06/28(水) 02:54:36ID:???0354304
2006/06/28(水) 03:01:06ID:???その意図は >>323 にあるとおりです。
データの表現方法を自在にしたいという目的があります。
標準出力を使う理由は、PHP は標準出力にモノを出力するのに都合がよいからです。
include するだけで画面に出ますから。
で、画面と関数定義を分けなさいという意見、至極もっともなわけですが、
関数内のほとんどがコードが HTML 出力をしている(というか、一時 PHPコードを解除して HTMLそのものが書かれている)ような場合、関数だからといってファイルを分けるという選択がしづらいこともあります。
たとえばテーブル中にテーブルを作っていく、なんてコードがありまして、ぱっと見HTMLなのですが、その部分は再帰的に呼び出される関数として構成されているわけです。
その関数を別ファイルにしてしまうと、テーブルの中身のHTMLコードまでそっちのファイルに行ってしまい、画面デザインの変更があると二つのファイルをいじるハメになってしまいます。
なので、最も欲しかった方法は、無名関数や無名クラス、あるいはファイル内にスコープが限定されるなプライベートな関数やクラスだったのです。
>>345
何度も言っていますが、クラスにしても、クラスの二重定義の問題は回避できないです。
関数とかクラスとかそういう問題じゃなくて、「何かの定義」の有効範囲の問題です。
>344、351
テンプレート作る人はPHPを知ってる人が対象なので、そういう無茶は無いという前提です。
>>352
それも考えたのですが、パラメータの引継ぎ方法に難がありました。
単なる文字列とか数値やそれらの配列程度ならなんとかなるのですが、何かのオブジェクトだったりしたときにダメでした。
0355nobodyさん
2006/06/28(水) 03:03:01ID:???しつこいよ。
無茶な要求にみんなイライラしながらも、我慢して解決法や問題点の指摘をしてくれたんだ。
これ以上荒らさず、さっさと消えろ。
0356nobodyさん
2006/06/28(水) 03:03:42ID:???だから「名前空間」言うとるじゃないか。
名前空間が使えない言語は、何かしらのルールで名前の衝突問題を乗り切る。
これ基本。
0357nobodyさん
2006/06/28(水) 03:05:03ID:???救いようの無い馬鹿だな。テンプレートにファイル名はあるんだろ?
クラス名をテンプレートファイル名と同じルールでつければ終わるだろうに。
何?テンプレートにclass{}とか書きたくない?
じゃラッパー書けばいいじゃん。意味わかる?
”あれだとこれができない、あれじゃないとこれはできない”
人様に聞かないと、この程度も解決できないくせに、何考えてんだ。
0358nobodyさん
2006/06/28(水) 03:09:27ID:???>>357
たぶんね、そのクラスを定義したファイルを何回もインクルードしたいって事だと思うのよ。
最初まさかと思ってたけど、もうそうとしか思えん。
0359nobodyさん
2006/06/28(水) 03:12:39ID:???includeで出力させるんじゃなくて、テンプレート出力を変数に格納し都度echoするようにすればそんなアホなことしなくて良いのに。
って、それすら理由もなく嫌だ嫌だ言うんだからどうしようもないな。
つーわけで304はプログラマ辞めた方がいいとおもう。周りも口にしないだけで大なり小なりそう思ってるとおもうよ。
0360nobodyさん
2006/06/28(水) 03:15:15ID:???0361nobodyさん
2006/06/28(水) 03:21:19ID:???0362nobodyさん
2006/06/28(水) 03:25:55ID:???>>307-309も理解できないウンコ共は、余計なこと言わないで黙って見てなさいってw
マジメな話、PHPで304の言うようなこと(関数のローカルスコープ化)はできないよ
自分でも言ってるけど、命名規則設けてコンフリクトを避けるのが一番スマートだと思われ
関数定義のオーバーライドとか消去とかやるにしても、結局テンプレートに手を入れなくちゃいけないんだろ?
0363nobodyさん
2006/06/28(水) 03:31:30ID:???似たような案件は見たことあるからまー気持ちは分からんでもないかも。
>>357
> クラス名をテンプレートファイル名と同じルールでつければ終わるだろうに。
その話はすでに>>323で終わってるけどね。
スキンの類だとファイル名からして同じだったり不定だったりして回避策にならんとは思う。
(使う環境に応じてディレクトリ+ファイル名に命名ルールを変更、とかの話が出てくる)
ファイル名変更に合わせてファイルの中身を置換するスクリプトが必要になるな。
まー、その仕組みでincludeで生のままファイルを扱おうって時点でかなりムリのある話だと思う。
0364362
2006/06/28(水) 03:32:20ID:???関数名のコンフリクトは避けられても、二重インクルードがあるのか
それなら>>304の言うような if で function_exists 使う方法かな…
関数定義とテンプレートを分けたくないんでしょ?
0365nobodyさん
2006/06/28(水) 03:33:57ID:???いや、皆いちいちコードの内容なんて見てないって。
質問内容と、そのやり取り(応答)の内容で「こりゃ駄目だ」って思ってるだけ。
require とかそういう話題は、そもそもそういう事で悩まなくていい実装方法を
例示してに過ぎないだけだと思うけど。
ちにかく、設計の仕方がまずい。これに尽きる。
0366nobodyさん
2006/06/28(水) 03:36:49ID:???個人的にはcreate_functionが1番てっとり早いと思うけどね。
多重生成でのメモリの無駄を気にしてるみたいだけど、
同じファイルの多重includeって何回くらいまであるんだろう?
2〜3回くらいなら気にせず生成させちゃった方が話が早くね?
0367nobodyさん
2006/06/28(水) 03:41:03ID:???その後はスルーするから
>>354
>たとえばテーブル中にテーブルを作っていく、なんてコードがありまして、ぱっと見HTMLなのですが、その部分は再帰的に呼び出される関数として構成されているわけです。
>その関数を別ファイルにしてしまうと、テーブルの中身のHTMLコードまでそっちのファイルに行ってしまい、画面デザインの変更があると二つのファイルをいじるハメになってしまいます。
それも構造次第
オレは似たようなことやってるけど、ちゃんと考えてるからテンプレートは弄っても関数が書かれてるファイルは弄らなくて済むように作ってる
ちゃんとMVCも考えて作んなきゃ糞
オマエのやろうとしてるのは他人が読めないコードを量産してるだけに過ぎない
※ココで言う「読めない」とは「読みにくい」「読む気が失せる」という意味
0368362
2006/06/28(水) 03:45:24ID:???プラグ印やらスキンやらをお手軽にやろうと思ったとき、>>304のアプローチはそう悪くないと思うぞ?
PHPのテキスト中にコードを埋められるという利点をうまく生かしてると思うが
お前ならどんな設計するんだい?
応答内容の悪さは若干後付気味なくらいで、他に問題あるか?
おれも似たような案件でinclude使ったからよくわかるというか、まぁそんときは関数定義しないで回避できたけど
>>366
画面デザインとPHP(の関数)が溶け合ったコードみたいだから、create_function化するのは苦労しそうだ
ついでに、関数とHTMLが溶け合ってるコードも見たことあるけど、それはそれで読みやすいというか、むしろ分けないほうがいい感じ
HTMLのど真ん中に関数定義があって、関数が終わらないのに再びHTMLになってるようなコードなんだけど、すげー合理的だった
ちょうどそれも再帰処理で、入れ子構造の画面を展開するトコだったんだけどな
0369304
2006/06/28(水) 04:03:35ID:???結論から言って、runkit 使うとかはやめようと思いました。
>>352 でローカルスコープ関数定義はできないこともわかりましたので、その方面でも踏ん切りがつきました。
create_function も、やはりHTMLが混じった長いの関数もあったため、あまり得策では無さそうです。
というわけで、命名規則の設定と function_exists でいってみようかと思います。
>>363 の言うような、ファイル中の関数を置換するというアプローチ、いい案ですね。
しかしテンプレートをパースするのに苦労しそうなので、今回はお手軽な方法に逃げてしまいます。
>>367
おっしゃること、よく理解できます。
ただその部分は、それはそれでうまい構造になってまして、HTMLの可読性もPHPの可読性もよく両立しているかに見えます。
混じりあったコードを分離して、なおかつお互いの可読性を高めるような構成はなかなか難しそうです。
そして、そういうコーディングスタイルを奪うことも、できればしたくないです。
あと、なんだかんだでダメな理由ばかりを返信することになってしまったこと、申し訳なく思っています。
でもたくさんの書込みを頂いて、みなさんには感謝してます。
ありがとう。
0370nobodyさん
2006/06/28(水) 04:06:00ID:???0371304
2006/06/28(水) 04:06:20ID:???× >>352 でローカルスコープ関数定義はできないこともわかりましたので、
○ >>362 でローカルスコープ関数定義はできないこともわかりましたので、
スマソ
0372362
2006/06/28(水) 04:27:32ID:???こんな再帰構造BBS展開のコードがあったとして、これを>>367だったらどう分ける?
<? hoge($thread); ?>
<? function hoge($data) { ?>
<TABLE BORDER=1>
<? foreach($data['thread'] as $a) { ?>
<TR><TD>
<?=Date('Y/m/d', $a['date'])?> 名前:<?=$a['name']?><BR>
タイトル:<?=$a['title']?><BR>
<?=$a['text'];?>
<P>
<? if(!empty($a['subthread'])) hoge($a['subthread']); ?>
</TD></TR>
<? } ?>
</TABLE>
<? } ?>
コードは簡単なので、説明省略
0373nobodyさん
2006/06/28(水) 05:55:27ID:???include と require って、ファイルが見つからないときに warning になるか fatal error になるかの違い以外に差異ってあるの?
0375nobodyさん
2006/06/28(水) 06:05:55ID:???いや、include でだめって話をしてるのに require を使えって回答がみたいだから。
>>365 の言いぶりにしても、require なら悩まなくてもいいという意見にも見えるし。
0376367
2006/06/28(水) 06:16:15ID:???Smartyを使う
0377nobodyさん
2006/06/28(水) 07:01:27ID:???Smartyについてはよく知らんが、
うpされてるコード読んだけど、それなら >>372 の方がシンプルで読みやすいし修正も容易そうじゃないか?
subtable.template を関数定義ファイルとしないで main.php に関数を定義してそこから include してる意図は、関数定義とHTMLを完全分離したということなのかな?
だが画面のデザインを変えるときに main.php にまで影響が及ぶ可能性があるのが嫌な感じだな。
ファイルがやたら細分化されていきそうなのも気になる。
>テンプレートは弄っても関数が書かれてるファイルは弄らなくて済む
と言っても、テンプレートファイル自体が分散するようだと、複数のファイルを弄るハメになることに変わりは無くなっちまうわな。
>>372 を function_exists を使って解決するって、関数定義が
<? if( !file_exists( "hoge" ) ) { function hoge($data) { ?>
みたいになるのかな。
試してみたら、確かに二重定義は発生しないみたいだけど、これはこれで面倒だな。
おまじないだと思えなくもないけどな。
create_function の適用は、このケースでは論外かな?
つか、直で画面に出力する場合は二重定義の心配はしなくていいんだよな?
あと、>>376 がうpしたファイルの main.php の最初の行(ついでに subthread も)は
$tempData['thread'][] = array(
だよな。つまらんツッコミだけど。
あ、おまいさんのやり方を否定してるわけではないぞ。
おれは偉そうなこと言っておきながらうまい方法を提示できんし。
0379nobodyさん
2006/06/28(水) 07:12:57ID:???ココ
>require とかそういう話題は、そもそもそういう事で悩まなくていい実装方法を
>例示してに過ぎないだけだと思うけど。
「そもそもそういう事で悩まなくてもいい」方法として例示されたのが「require」と捉えれば、
include での悩みは require には無い
ととれない?
いや俺的には include と require が一緒ということなら、もうどうでもいいんだけど。
0381nobodyさん
2006/06/28(水) 08:37:19ID:???■ このスレッドは過去ログ倉庫に格納されています