トップページ⇒php
1001コメント353KB

【PHP】下らねぇ質問はここに書き込みやがれ 23

■ このスレッドは過去ログ倉庫に格納されています
00019092006/06/23(金) 01:59:03ID:lPdqGX0Z
PHPに関するくだらねぇ質問用スレです。
ここなら本スレで回答のないお前の下らない質問に回答があるかも知れません。

まず読め【PHP マニュアル】
http://www.php.net/manual/ja/

過去スレは>>2
0281nobodyさん2006/06/27(火) 20:53:17ID:???
>>278
リンクを示すなら、こっちだろ
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:???
>>280
WindowsXP Proです

>>281
magic_quotes_gpc = Offに変えて、ApacheをRestartしても変化なしです。
一度Stopさせたほうがよいのでしょうか
0283nobodyさん2006/06/27(火) 21:18:19ID:???
>>281
Stop⇒Startしたは反映されましたが、
相変わらず動かないです。

DLLの
0284nobodyさん2006/06/27(火) 21:20:28ID:???
>>281
手順6の作業が抜けていたので、system32にコピーして
Apacheを再起動させましたが、まったく変化がありません
0285nobodyさん2006/06/27(火) 21:23:05ID:???
>>284
ExtensionDirはちゃんと設定したか?
0286nobodyさん2006/06/27(火) 21:25:41ID:???
>>285
extension_dir = "php/ext" なので、大丈夫です。
02872782006/06/27(火) 21:28:33ID:???
とりあえずphp.iniをうpしました
http://www.uploda.org/uporg428225.txt
0288nobodyさん2006/06/27(火) 21:30:40ID:???
>>286
それでちゃんと正しいところを指してるとは思うけど
(ロード出来なかったらエラー出てる筈だから)
念のためダブルクォートで括ったドライブ名から書いたフルパスにしてみ。
02892782006/06/27(火) 21:33:33ID:???
>>288
パスをC:/PHP/extとしたら実行できました。
ありがとうございました。
02902782006/06/27(火) 21:38:48ID:???
あと、しょうもない質問すみません^^;
作成したDBを直で見たいときは、どのソフトを使えばよいのでしょうか
MySQLはAccessでは無理なんでしたよね
0291nobodyさん2006/06/27(火) 21:45:37ID:792aro1J
データベース(MySQL)にINSERTする文字列は、何かに変換する必要はありますか?
あるとすればそれはどんなことでしょうか。
0292nobodyさん2006/06/27(火) 21:47:50ID:???
>>290
phpMyAdmin

>>291
addslashes
0293nobodyさん2006/06/27(火) 21:49:43ID:792aro1J
>>292
ありがとんこつラーメン(・∀・)
0294nobodyさん2006/06/27(火) 21:49:57ID:???
上記の理由から、当サイトにて公開していたphpMyAdmin日本語版は配付終了とさせて頂きます。


orz
0295nobodyさん2006/06/27(火) 21:51:33ID:???
phpMyAdminは元から日本語対応だし
0296nobodyさん2006/06/27(火) 21:53:20ID:???
どもありです。
これはシェアなのでしょうか。
0297nobodyさん2006/06/27(火) 21:57:44ID:???
function make_girl_friend($man) { # >>242用
 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:???
>>295
いや、昔は日本語対応なんてしてなかったよ。
294のは日本語対応されたので、私家版の配布を止めます宣言
つか古い話だよなw
0299nobodyさん2006/06/27(火) 22:09:33ID:???
>>298
そうなのですか。
config.inc.phpが見つからないのは仕様でしょうか・・・
0300nobodyさん2006/06/27(火) 22:20:28ID:???
>>299
俺に振るのかw

config.default.phpをベースに変更して、自分用のconfig.inc.phpを作る。
最近ので実験版とかじゃないやつは、installユーティリティが入ってて
それで自分用のconfig.inc.phpを作ることも出来る。
バージョンで差異があるので、自分の入手したもののドキュメントをあたれ。
0301nobodyさん2006/06/27(火) 23:09:21ID:???
>>300
いえいえ、詳しそうなので^^;
使ってみたのですが、まったく使い方がわかりませんね(笑
とりあえず$cfg['DefaultLang'] = 'ja';にしたのですが、日本語にならないですしorz
0302nobodyさん2006/06/27(火) 23:09:50ID:???
phpで別ドメインのセッションの共有ってどうやるのです?
サブドメインの場合はsession.cookie_domainでできるみたいですが、
example.jpとexample.comとexample.netとauau.infoで共有する方法を探しています。
宜しくお願い致します。
0303nobodyさん2006/06/27(火) 23:10:19ID:8VAiAYdr
>>276
3で別ファイルに記録しています。

アクセスログを全部見るまではしませんが、
特定のアクション(ボタン押し下げ等)をした時のIPなどを
記録したいと思いまして。エラー処理ではないのですけど。
0304nobodyさん2006/06/28(水) 00:00:34ID:5cOrr7Id
include の取消みたいなことはできますか?
もう少し正確に言うと、include したファイル内で定義された関数の取消というか。
同じファイルを複数回 include したいのですが、そのファイルの中で関数定義があるため、二度目の include でエラーになってしまいます。
さらに悪いことに、include されるファイルは数種類あり、それぞれのファイルの中で同名の関数が定義されていることもあります。

その include されるファイルというのは画面のテンプレートになっていて、メインのスクリプトでは決まった変数にパラメータをセットしておき、
画面テンプレートを include することにより、画面出力を行うという仕組みになっています。
画面出力と言っても、それは HTMLファイルに出力するようになっています。
メインのスクリプトは大量のHTMLファイルを作成するスクリプトで、数種類の画面テンプレートを何度も include して、その結果をファイルに落とし込む処理をしています。
で、画面テンプレート内に固有の関数定義をした場合に、include が失敗するという問題に突き当たってしまったというわけです。

今は実験的に、関数定義を if(function_exists(〜)) の trueパートに置くことにより二重定義を避けていますが、別ファイルに同じ関数名があるようなケースに問題があります。
全ファイルを通して関数名をユニークにするという案もあるかと思いますが、ひとまずそれ以外の方法があればそれを知りたいです。
03053042006/06/28(水) 00:05:07ID:???
× 関数定義を if(function_exists(〜)) の trueパートに置くことにより
○ 関数定義を if(!function_exists(〜)) の trueパートに置くことにより
0306nobodyさん2006/06/28(水) 00:13:30ID:???
>>304

悩むべきポイントを大幅に間違ってるような気がする。
やろうとしてることはだいたいわかったが、説明するより直接手加えた方がはやそうなんで
実物の骨組みをここに貼り付けてくれ。或いはソースをまとめて、どっかにウプしてくれ。
03073042006/06/28(水) 00:29:21ID:???
イメージですが、

main.php

$resource=InitResource(); // 出力ファイル名、画面テンプレート名、パラメータなどを求めるための何らかのリソース
while(($params = GetParameters($resource)) !==false) {
 StdoutToFileStart($params['outfile']); // 標準出力をファイル化する処理開始(独自関数)
 include $params['template']; // $param内に設定された様々な値を利用するファイル
 StdoutToFileEnd(); // ファイル化終了
 unset($param);
}
03083042006/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;
}
?>
03093042006/06/28(水) 00:35:16ID:???
main.php は、DBを引くなどしてパラメータ $params を作り、そのパラメータに基づいて画面テンプレートを include し、ファイル化していきます。
include される画面テンプレートは tenplate1.php のような感じで、ここでは固有関数 hoge を定義しています。
実際はもうちょっと複雑な処理で、しかも画面テンプレート毎に固有で、標準化しづらい内容のものになっています。
で、画面テンプレートはどんどん増えていきます。
どんどん増える都合、関数名をユニークにするなどの処置は管理上の問題が出てきまして、できれば避けたいのです。
0310nobodyさん2006/06/28(水) 00:44:16ID:???
>>264
なにしたの?
自分のとこがきになる
0311nobodyさん2006/06/28(水) 00:57:54ID:???
>>304
抽象クラス一個作って継承すれば?
インクルードの取り消しとかぜってーごちゃごちゃする気がするんだけど
ちなみに取り消しができるかどうかは俺は知らね
03123042006/06/28(水) 01:02:15ID:???
>>311
クラスにしても二重定義の問題は出るかと思いますが、そんなことないですか?
名前無しの即値クラスみたいなものが使えたりします?
0313nobodyさん2006/06/28(水) 01:08:49ID:???
>>302
できない

>>303
関数名にとらわれ過ぎ
parse_ini_file()でもiniファイル以外を開いていいんだよ

>>304
できない
というか、プログラムの基本構造の組み立て方が間違ってる
1.機能が違うのに同名の関数がある→関数名の名付け方がおかしい
2.機能が同じで同名の関数がある→関数の割り振り方がおかしい

1なら素直にリネーム
2ならそういう関数を別ファイルにしてinclude

一番いいのはクラス化すること(PHP4以上)
0314nobodyさん2006/06/28(水) 01:10:39ID:???
>>312
なんでクラス作って二重定義になるんだ
同じクラスを2個作る気か
03153042006/06/28(水) 01:19:50ID:???
>>314
同じファイルを二度 include することがあるからです。

>>313
最終的にはリネームすることになると思うのですが、まずは他の方法を模索したいところです。
名前ばダブらないように管理するということを、できればしたくないからです。
スコープがファイル内だけの関数定義ができるとか、Javaの無名クラスみたいのが作れるとかがあればいいんですけどね・・・
多少トリッキーでも、何かいい方法は無いものですかね。

ちなみに関数名って、MakeTree とか MakeTable みたいなありがちな名前で、でもその実装はテンプレートによって微妙に違うという、困った状況になってます。
0316nobodyさん2006/06/28(水) 01:20:51ID:???
requierじゃだめなの?
0317nobodyさん2006/06/28(水) 01:47:02ID:???
>>304
おまいさんはinclude_onceとかrequire_onceとか知らないの?
0318nobodyさん2006/06/28(水) 01:47:53ID:???
言語仕様を無視して、うんこな設計を推し進めるなよ。
03193112006/06/28(水) 01:49:58ID:???
>>304
何で継承してんのに多重定義になるの?そこはクラス名変えろよ。
さっきも言ったけどトリッキーなのはやめといた方が無難な気がする。

>>317
別ファイルに同名関数があるんだってさ

ブラジル猛攻
0320nobodyさん2006/06/28(水) 01:57:02ID:???
>>317
include_once は、二度目以降テンプレートの中身が出力されなくなるのでダメです。
・同じファイルを二度以上 include する必要があり、
・その中身は include されるたびに評価される必要がある
という条件になります。

>>319
同じファイルを二度 include する必要があるという点を考慮していただけないでしょうか。
異なるファイルを一度ずつ include するなら、ファイル間でクラス名を変えればいいというのは正解ですが。
03213172006/06/28(水) 01:57:06ID:???
なるほど・・・
基礎というか組み立て方が分かってないのね
把握した

>>304
ファイル毎に機能を振り分けて図に書いて整理してみるといいよ。
プログラムなんて積み木みたいなもんだから、ちゃんと組み立てればそれなりのものができるけど、
全体を把握せずにガンガン積み上げていったら一気に崩壊するよ。
03223172006/06/28(水) 02:02:30ID:???
なんか書込みが増えてた・・・

>>320
自分もinclude_once使ってるけど、
>二度目以降テンプレートの中身が出力されなくなるのでダメです。
こんなコトになったことはないよ。
include_onceでテンプレートファイルをそのまま出力してるクチかな?
03233042006/06/28(水) 02:03:41ID:???
>>320 の発言は自分の発言です。

>>321
関数ライブラリを作って include しようって話ではなく、画面テンプレートを include により出力しよう、というのが今回のテーマです。
画面テンプレートは、プラグインのようなイメージで勝手に追加できる、という感じにしたいのです。
そのため、テンプレートの作者間で意思疎通をしない限りは、関数名がダブるという事態が発生してしまうのです。
命名規則として、テンプレートファイル名に等しいプレフィックスを関数名につける、等のルールを設定することもできますが、
できれば余計なルールを設けないような選択肢があるのならそちらを採りたいと思った次第です。
03243042006/06/28(水) 02:06:35ID:???
>>322
あれ、>>308 のようなファイルを include_once したとき、二度目の include_once でこの HTML の内容って出ますか?
出ないと思ってたのですが、勘違いかも。
ちょっくら実験してきます。

ちなみに、include で標準出力に出力されるべき内容を、出力バッファハンドラを設定することによりファイルへ書き込む、という処理をやってます。
03253042006/06/28(水) 02:10:18ID:???
実験してみました。

test.inc というファイルに
TEST1

という内容を書込み、

<?
include_once 'test1.inc';
include_once 'test1.inc';
?>

とやっら、

TEST1

と一行だけ出力されました。
残念ながら、これじゃダメなんです。
0326nobodyさん2006/06/28(水) 02:19:47ID:???
>>304
前後の話は読んでない。
そりゃinclude_onceなら一行(一回)しか実行されないよ。
両方実行したいなら普通のincludeでやってみれみれ
0327nobodyさん2006/06/28(水) 02:19:58ID:???
>>324
>>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>
0328nobodyさん2006/06/28(水) 02:20:39ID:???
>>304
設計思想がそもそもおかしいのをどうにかしたいと言われてもねぇ。
まぁ、「名前空間」で検索してみたら?
0329nobodyさん2006/06/28(水) 02:22:22ID:???
これじゃダメなんです。

一体何様なんだ、こいつはww
0330nobodyさん2006/06/28(水) 02:25:39ID:???
>>304

テンプレートファイルに名前ついてるだろ?それが固有の識別子になってるのに、
なんでclass化するなりして名前空間を指定しないでglobalに放り込んでるんだ????

template1.php → class template1 で全部解決するやん
03313172006/06/28(水) 02:27:20ID:???
>>327
フォローありがと

>>325
それ、テンプレートとPHPが1つのファイルに混ざって書いてあるのね。
>>308の方は見て無かったよ。ゴメン

HTML部分とPHPの関数部分を切り離して、HTMLはincludeで何度も出力、
PHP関数部分はsubroutine.phpとかにでも移してinclude_onceで読み込むのがいいと思うよ。
0332nobodyさん2006/06/28(水) 02:27:39ID:???
requireだな
0333nobodyさん2006/06/28(水) 02:27:59ID:???
>>304
よし、俺様がまともな解決法を教えてやるよ!
これでも使っとけ!
拡張組み込む必要はあるが、お前のやりたいことがそのまま叶うからな!
http://www.php.net/manual/ja/function.runkit-function-redefine.php

じゃ、もう二度と来るなよ!
0334nobodyさん2006/06/28(水) 02:30:33ID:???
>>330
もうちょい言うなら、それに加えてテンプレートと中で使う固有処理はファイルを分けて、
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:???
全部同じ人だよ
03373042006/06/28(水) 02:36:54ID:???
>>327
create_functin なんてものがあるんですね!
長い関数になると少々厳しそうですが、名前のダブリを心配しなくていい方法として大変有力ですね!

でもこれ、同じ引数で複数回呼び出したときって、同じ内容の別名の関数がどんどんできていくのでしょうか?
リファレンスをちょっと見た範囲では、特に寿命について書いてあるわけでもなく、また関数を削除するアクションについても
書いてないので、スクリプトの実行が終了するまでメモリに留まるんでしょうね。
戻り値が「関数オブジェクト」みたいなものなら良かったんですけどね・・・

さらに >>333
runkit_function_redefine なんてのがあるのですか。
というか、runkit_function_remove なんてのがあるんですね!
これが正解な気がしますね!
ただ、runkit の使い方について不勉強なもので、ターゲットの環境で使えるかどうか不明なのがナニです。
とりあえず実験してみます。

なんにしても、新しい材料が手に入ったので、何かいい実装方法があるか検討してみます。
ありがとうございました。
0338nobodyさん2006/06/28(水) 02:37:58ID:???
>>337
> これが正解な気がしますね!
だって。
はいはい、終了。
0339nobodyさん2006/06/28(水) 02:39:17ID:???
>>これが正解

いや、いいけどね。
0340nobodyさん2006/06/28(水) 02:39:48ID:???
ごめん、かぶった
0341nobodyさん2006/06/28(水) 02:43:09ID:???
初級者が初心者を輪姦中と聞いて�dで来ました!
0342nobodyさん2006/06/28(水) 02:44:09ID:???
includeで自動出力させる理由がわからない・・・
template.phpをtemplate.class.phpに書き換えるスクリプト一つ用意すれば何もしなくても解決できる・・・
そもそもtemplateに関数定義とか入ってる時点でtemplateじゃないと思うし、分離すりゃいい・・・
標準出力使う理由も不明・・・

なんか、ものすごく間違った覚え方したまま成長しちゃって取り返しが付かなくなってる感じ。
手軽さとか利便性とか分かりやすさを重視するため!って思いこんでるだろうけど、
あんたの考え方さえ変わればすぐに手軽で分かりやすいシステムになるよ。
自分がその作業の一番のボトルネックだって認識するところからはじめるべき。
03433042006/06/28(水) 02:44:19ID:27YOZKQj
あー
関数名(あるいはクラス名)がユニークになるようなルールを定めて実践しろというのも正解だとは思いますが、
今回の意図としては、どちらかといえば関数名のダブリを避けるというよりは、関数のプライベート化という方が近いので、
関数エントリの削除という手段が正解だと判断したものです。
0344nobodyさん2006/06/28(水) 02:45:30ID:???
>>343
じゃあ、ユーザが「include」って名前の関数を作りたいって言ったらどうするんだ?
0345nobodyさん2006/06/28(水) 02:45:41ID:???
>関数のプライベート化という方が近いので、
クラスって聞いたことない?
>関数エントリの削除という手段が正解だと判断したものです。
みんなそれが間違ってるって指摘してんのに、一人固執してるから進まないんだよ
0346nobodyさん2006/06/28(水) 02:47:59ID:???
>>337
> でもこれ、同じ引数で複数回呼び出したときって、同じ内容の別名の関数がどんどんできていくのでしょうか?
まぁ、そうだね。多重生成を防止する方法はいくらでもあると思うけど。
0347nobodyさん2006/06/28(水) 02:48:14ID:???
とんだ頑固者だぜ!
0348nobodyさん2006/06/28(水) 02:48:50ID:???
304の同僚?依頼主?が可哀想に思えてきた
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:???
system()でtemplate動かせばいいだけじゃ
0353nobodyさん2006/06/28(水) 02:55:45ID:???
>>350

根拠もなくそのやり方は嫌だという人間に質問する権利はないとおもう
03543042006/06/28(水) 03:01:06ID:???
>>342
その意図は >>323 にあるとおりです。
データの表現方法を自在にしたいという目的があります。
標準出力を使う理由は、PHP は標準出力にモノを出力するのに都合がよいからです。
include するだけで画面に出ますから。

で、画面と関数定義を分けなさいという意見、至極もっともなわけですが、
関数内のほとんどがコードが HTML 出力をしている(というか、一時 PHPコードを解除して HTMLそのものが書かれている)ような場合、関数だからといってファイルを分けるという選択がしづらいこともあります。
たとえばテーブル中にテーブルを作っていく、なんてコードがありまして、ぱっと見HTMLなのですが、その部分は再帰的に呼び出される関数として構成されているわけです。
その関数を別ファイルにしてしまうと、テーブルの中身のHTMLコードまでそっちのファイルに行ってしまい、画面デザインの変更があると二つのファイルをいじるハメになってしまいます。

なので、最も欲しかった方法は、無名関数や無名クラス、あるいはファイル内にスコープが限定されるなプライベートな関数やクラスだったのです。

>>345
何度も言っていますが、クラスにしても、クラスの二重定義の問題は回避できないです。
関数とかクラスとかそういう問題じゃなくて、「何かの定義」の有効範囲の問題です。

>344、351
テンプレート作る人はPHPを知ってる人が対象なので、そういう無茶は無いという前提です。

>>352
それも考えたのですが、パラメータの引継ぎ方法に難がありました。
単なる文字列とか数値やそれらの配列程度ならなんとかなるのですが、何かのオブジェクトだったりしたときにダメでした。
0355nobodyさん2006/06/28(水) 03:03:01ID:???
>>354
しつこいよ。
無茶な要求にみんなイライラしながらも、我慢して解決法や問題点の指摘をしてくれたんだ。
これ以上荒らさず、さっさと消えろ。
0356nobodyさん2006/06/28(水) 03:03:42ID:???
>>354
だから「名前空間」言うとるじゃないか。
名前空間が使えない言語は、何かしらのルールで名前の衝突問題を乗り切る。
これ基本。
0357nobodyさん2006/06/28(水) 03:05:03ID:???
>>304

救いようの無い馬鹿だな。テンプレートにファイル名はあるんだろ?
クラス名をテンプレートファイル名と同じルールでつければ終わるだろうに。
何?テンプレートにclass{}とか書きたくない?
じゃラッパー書けばいいじゃん。意味わかる?

”あれだとこれができない、あれじゃないとこれはできない”
人様に聞かないと、この程度も解決できないくせに、何考えてんだ。
0358nobodyさん2006/06/28(水) 03:09:27ID:???
includeで出力しようとしているところが間違っていたと気づいてほしかったな。

>>357
たぶんね、そのクラスを定義したファイルを何回もインクルードしたいって事だと思うのよ。
最初まさかと思ってたけど、もうそうとしか思えん。
0359nobodyさん2006/06/28(水) 03:12:39ID:???
>>358

includeで出力させるんじゃなくて、テンプレート出力を変数に格納し都度echoするようにすればそんなアホなことしなくて良いのに。
って、それすら理由もなく嫌だ嫌だ言うんだからどうしようもないな。

つーわけで304はプログラマ辞めた方がいいとおもう。周りも口にしないだけで大なり小なりそう思ってるとおもうよ。
0360nobodyさん2006/06/28(水) 03:15:15ID:???
304は知識不足というより人格不足だな・・・・・
0361nobodyさん2006/06/28(水) 03:21:19ID:???
こんなキチガイを誘い込んだ306が一番悪いとおもふ
0362nobodyさん2006/06/28(水) 03:25:55ID:???
クラスにしろとかrequireにしろとか_onceにしろとか、もう見てらんない
>>307-309も理解できないウンコ共は、余計なこと言わないで黙って見てなさいってw
マジメな話、PHPで304の言うようなこと(関数のローカルスコープ化)はできないよ
自分でも言ってるけど、命名規則設けてコンフリクトを避けるのが一番スマートだと思われ
関数定義のオーバーライドとか消去とかやるにしても、結局テンプレートに手を入れなくちゃいけないんだろ?
0363nobodyさん2006/06/28(水) 03:31:30ID:???
掲示板のスキンとかblogのテンプレートファイルとかの類かな。
似たような案件は見たことあるからまー気持ちは分からんでもないかも。

>>357
> クラス名をテンプレートファイル名と同じルールでつければ終わるだろうに。
その話はすでに>>323で終わってるけどね。
スキンの類だとファイル名からして同じだったり不定だったりして回避策にならんとは思う。
(使う環境に応じてディレクトリ+ファイル名に命名ルールを変更、とかの話が出てくる)
ファイル名変更に合わせてファイルの中身を置換するスクリプトが必要になるな。

まー、その仕組みでincludeで生のままファイルを扱おうって時点でかなりムリのある話だと思う。
03643622006/06/28(水) 03:32:20ID:???
あぁ おれもウンコだった…
関数名のコンフリクトは避けられても、二重インクルードがあるのか
それなら>>304の言うような if で function_exists 使う方法かな…
関数定義とテンプレートを分けたくないんでしょ?
0365nobodyさん2006/06/28(水) 03:33:57ID:???
>>362
いや、皆いちいちコードの内容なんて見てないって。
質問内容と、そのやり取り(応答)の内容で「こりゃ駄目だ」って思ってるだけ。
require とかそういう話題は、そもそもそういう事で悩まなくていい実装方法を
例示してに過ぎないだけだと思うけど。
ちにかく、設計の仕方がまずい。これに尽きる。
0366nobodyさん2006/06/28(水) 03:36:49ID:???
>>364
個人的にはcreate_functionが1番てっとり早いと思うけどね。
多重生成でのメモリの無駄を気にしてるみたいだけど、
同じファイルの多重includeって何回くらいまであるんだろう?
2〜3回くらいなら気にせず生成させちゃった方が話が早くね?
0367nobodyさん2006/06/28(水) 03:41:03ID:???
どうしてもつっこみたいから一言だけ言わせて
その後はスルーするから

>>354
>たとえばテーブル中にテーブルを作っていく、なんてコードがありまして、ぱっと見HTMLなのですが、その部分は再帰的に呼び出される関数として構成されているわけです。
>その関数を別ファイルにしてしまうと、テーブルの中身のHTMLコードまでそっちのファイルに行ってしまい、画面デザインの変更があると二つのファイルをいじるハメになってしまいます。
それも構造次第
オレは似たようなことやってるけど、ちゃんと考えてるからテンプレートは弄っても関数が書かれてるファイルは弄らなくて済むように作ってる
ちゃんとMVCも考えて作んなきゃ糞

オマエのやろうとしてるのは他人が読めないコードを量産してるだけに過ぎない
※ココで言う「読めない」とは「読みにくい」「読む気が失せる」という意味
03683622006/06/28(水) 03:45:24ID:???
>>365
プラグ印やらスキンやらをお手軽にやろうと思ったとき、>>304のアプローチはそう悪くないと思うぞ?
PHPのテキスト中にコードを埋められるという利点をうまく生かしてると思うが
お前ならどんな設計するんだい?
応答内容の悪さは若干後付気味なくらいで、他に問題あるか?
おれも似たような案件でinclude使ったからよくわかるというか、まぁそんときは関数定義しないで回避できたけど

>>366
画面デザインとPHP(の関数)が溶け合ったコードみたいだから、create_function化するのは苦労しそうだ
ついでに、関数とHTMLが溶け合ってるコードも見たことあるけど、それはそれで読みやすいというか、むしろ分けないほうがいい感じ
HTMLのど真ん中に関数定義があって、関数が終わらないのに再びHTMLになってるようなコードなんだけど、すげー合理的だった
ちょうどそれも再帰処理で、入れ子構造の画面を展開するトコだったんだけどな
03693042006/06/28(水) 04:03:35ID:???
引っ込んでようと思ったのですが、アドバイスをいただけているようなのでお礼がてらに。
結論から言って、runkit 使うとかはやめようと思いました。
>>352 でローカルスコープ関数定義はできないこともわかりましたので、その方面でも踏ん切りがつきました。
create_function も、やはりHTMLが混じった長いの関数もあったため、あまり得策では無さそうです。
というわけで、命名規則の設定と function_exists でいってみようかと思います。

>>363 の言うような、ファイル中の関数を置換するというアプローチ、いい案ですね。
しかしテンプレートをパースするのに苦労しそうなので、今回はお手軽な方法に逃げてしまいます。

>>367
おっしゃること、よく理解できます。
ただその部分は、それはそれでうまい構造になってまして、HTMLの可読性もPHPの可読性もよく両立しているかに見えます。
混じりあったコードを分離して、なおかつお互いの可読性を高めるような構成はなかなか難しそうです。
そして、そういうコーディングスタイルを奪うことも、できればしたくないです。

あと、なんだかんだでダメな理由ばかりを返信することになってしまったこと、申し訳なく思っています。
でもたくさんの書込みを頂いて、みなさんには感謝してます。
ありがとう。
0370nobodyさん2006/06/28(水) 04:06:00ID:???
eval
03713042006/06/28(水) 04:06:20ID:???
あちゃー
× >>352 でローカルスコープ関数定義はできないこともわかりましたので、
○ >>362 でローカルスコープ関数定義はできないこともわかりましたので、

スマソ
03723622006/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:???
>>365
include と require って、ファイルが見つからないときに warning になるか fatal error になるかの違い以外に差異ってあるの?
0374nobodyさん2006/06/28(水) 06:01:56ID:???
>>373
無いよ。何の話??
0375nobodyさん2006/06/28(水) 06:05:55ID:???
>>374
いや、include でだめって話をしてるのに require を使えって回答がみたいだから。
>>365 の言いぶりにしても、require なら悩まなくてもいいという意見にも見えるし。
03763672006/06/28(水) 06:16:15ID:???
>>372
Smartyを使う
0377nobodyさん2006/06/28(水) 07:01:27ID:???
>>376
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(
だよな。つまらんツッコミだけど。

あ、おまいさんのやり方を否定してるわけではないぞ。
おれは偉そうなこと言っておきながらうまい方法を提示できんし。
0378nobodyさん2006/06/28(水) 07:06:33ID:???
>>375
そりゃ君に日本語読解力が無いだけでは…。>>365のどこ読んだらそう読めるんだ。
0379nobodyさん2006/06/28(水) 07:12:57ID:???
>>378
ココ
>require とかそういう話題は、そもそもそういう事で悩まなくていい実装方法を
>例示してに過ぎないだけだと思うけど。

「そもそもそういう事で悩まなくてもいい」方法として例示されたのが「require」と捉えれば、
include での悩みは require には無い
ととれない?

いや俺的には include と require が一緒ということなら、もうどうでもいいんだけど。
0380nobodyさん2006/06/28(水) 07:23:55ID:???
>>379
とれるとれる
オレもそう思って「?」ってなった
0381nobodyさん2006/06/28(水) 08:37:19ID:???
くだ質らしい低レベルなレスが続いていて微笑ましいですね^^;;;;;;;;
■ このスレッドは過去ログ倉庫に格納されています