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

【PHP】下らねぇ質問はID出して書き込みやがれ 76

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2008/11/13(木) 04:15:32ID:???
質問者はまず>>1を良く読むこと(必須!)
過去スレ、関連スレ、FAQなどは>>2-10辺り
次スレは>>980が立てる。10分以内に立たない場合、宣言してから立てたい人が立てること。

◆前スレ
【PHP】下らねぇ質問はID出して書き込みやがれ 75
http://pc11.2ch.net/test/read.cgi/php/1224168721/

◆質問用テンプレ
【OS名】vine linux
【PHPのバージョン】php5.26
【連携ソフトウェア】mysql
【質問内容】

◆質問する時の注意
・ スレを上げて自分のIDを表示させること。(メール欄に何も記述しない。専ブラのsageチェックを外す)
・ 己の行った操作、変更などを詳しく明記すること。
・ エラーメッセージはそのまま表記すること。「エラーが出ます」だけでは回答不可。
・ 質問者として、態度をわきまえること。
・ 事前に関連リンクの公式マニュアル、リファレンス本くらいはちゃんと目を通しておくこと。
(PHPで最良の教本はこの公式マニュアル。市販の書籍は嘘が多いので鵜呑みにしない。)

◆質問後の注意
・2回目以降は最初に質問した際のレス番号を入れて、偽者防止に必ずIDを表示させること。
・解決しなくても回答をもらった場合はお礼を言うこと。
 (荒らし、煽りは除く。煽られたときも、無闇に反論せずスルーすること。)

◆回答者への注意
・誰にレスしているのか分からないと困るので、>>(アンカー)をつけて回答すること。

【その他諸注意】
・SQL・正規表現・PEAR・テンプレート(Smarty等)・フレームワークは各該当スレへ
0402nobodyさん2008/11/21(金) 02:02:30ID:???
再インスコ
0403nobodyさん2008/11/21(金) 02:05:18ID:???
OS : WinXP SP3
PHP : 5.2.6
MySQL : 5.1.29-rc

先ほど環境を整えたのですが、
mysql_connect 関数を呼び出すと httpd.exe に強制終了が起きてしまいます。
Client API header version は 5.1.29-rc で本体と一致しています。

何が原因でしょうか。
ご教授をよろしくお願いいたします。
0404nobodyさん2008/11/21(金) 02:06:07ID:???
>>403
>>1
http://www.google.com/search?q=%E3%81%94%E6%95%99%E6%8E%88
0405nobodyさん2008/11/21(金) 02:09:46ID:AgX6JP+G
403です。
ID出し忘れました。失礼しました。

ご教授ください、は誤用なんですね……。
04064032008/11/21(金) 02:35:55ID:???
MySQLのバージョンを5.0系へ落とすことで自己解決しました。
何でも最新がいいわけではないんですね。

失礼しました。
04073822008/11/21(金) 02:43:19ID:???
ご教示なんですね。全くすれ違いですが参考になりました。笑
ふつうにご教授頂ければ幸いです。とかつかってたよ。はずかしい。。。
0408nobodyさん2008/11/21(金) 05:37:17ID:???
おれ先月、CCNP取ったけど、何か質問あるか?
とあるスレで発言したら、焼き餅焼かれてひどい目にあったので、こっちに来た。
CCNP取ったって言ったけど、元はweb系のSE。
web系の案件も何件かやって、やり尽くした感があるので、今はweb系より高度な技術が要求されるインフラ系のSEにスキルアップ中。
0409nobodyさん2008/11/21(金) 07:03:48ID:???
>>408
やきもちじゃなくてスレ違いで勘違いな余計な自己紹介するからだろ
0410nobodyさん2008/11/21(金) 07:34:39ID:BR6mi0Le
>>400
ごめん。
php --rf mb_ereg_replace
php --re mbstring
だった。
php -h でコマンドラインオプションが確認できます。

間違っていることに気づいて、正しいオプションで実行した結果が
あれなら、重大な問題があるような気がします。
エラーログにも残っていると思うけど、IISだとどうなのか
よくわからないなぁ。
0411nobodyさん2008/11/21(金) 07:54:04ID:???
>>398
パーミッションの設定以外は
windowsで実験可能
0412nobodyさん2008/11/21(金) 08:35:35ID:zW/fBXPA
質問

ウチが借りてるレンタルサーバーは
phpファイルのパーミッションが400で
動いているんだが、これでいいのかな?
0413nobodyさん2008/11/21(金) 08:42:11ID:zW/fBXPA
最初、

「なんで実行権限与えてないのにPHPのファイルが
動くんだろう?」

って思ったけど、もしかして、

「アパッチのモジュールとして動いているから、
実行権限は与える必要は無い」

って解釈であってるのかな?
0414nobodyさん2008/11/21(金) 14:46:23ID:wJTKWOfA
SMTPとの通信をトレースしているのですが
まずSMTPに
 $socket=fsockopen($server,$port);
します

 fputs($socket,"EHLO $server\r\n");
した後応答が複数行あるのですが、通信をタイムアウトさせることなく
過不足なく取得するにはどうしたらいいでしょうか

$response.=fgets($socket,1024);では単行しか取得できず、
fgetsがまだ用意されていないのにfgetsを実行した場合、
通信のタイムアウトまで待ってしまいます
0415nobodyさん2008/11/21(金) 15:03:24ID:wJTKWOfA
自己解決しました
[RESPONSECODE]-[RESPONSESTRING] //最終行以外
[RESPONSECODE] [RESPONSESTRING] //最終行
ですね
0416nobodyさん2008/11/21(金) 15:16:06ID:???
くだらなくねえ高度な質問でした
0417nobodyさん2008/11/21(金) 15:43:29ID:XpwRzbFr
Dreamweaver使ってPHPしてる方とかいますか。
0418nobodyさん2008/11/21(金) 15:48:54ID:???
それはできればやめとけ
0419nobodyさん2008/11/21(金) 22:01:25ID:zW/fBXPA
質問

拡張子が.phpでもSSIって使えるの?
よくある設定だと、SSIを使いたいときには、
拡張子をshtmlにしてください、とかあるじゃん。

そしたら、php使えなくネ?って思うわけだ。
0420nobodyさん2008/11/21(金) 22:12:57ID:???
>>419
設定次第
0421nobodyさん2008/11/21(金) 22:14:33ID:???
>>414
fget()は1行ずつ取る関数。
それならループで回せばいい。

PHP5ならstream_get_contents()が楽ちん
0422nobodyさん2008/11/21(金) 22:14:56ID:???
本物の変態だなw
0423nobodyさん2008/11/21(金) 22:15:15ID:???
>>413
あってる
0424nobodyさん2008/11/21(金) 22:17:49ID:???
>>393
仕組みも糞も基本中の基本
0425nobodyさん2008/11/21(金) 22:21:20ID:zW/fBXPA
質問

何回も使うファイルをincludeするのに、
SSI使う方法と、phpのinclude使う方法と、
2つの選択肢があると思うのだが、
どちらを使ったほうがいい?
0426nobodyさん2008/11/21(金) 22:23:56ID:???
>>361
PHPでは配列と連想配列との区別はない
よって全てを「配列」と呼んでおけばいい
っていうか、そもそも連想配列=ハッシュでないので。
0427nobodyさん2008/11/21(金) 22:30:31ID:???
>>277
<?php
var_dump($hoge);
exit;
0428nobodyさん2008/11/21(金) 22:31:22ID:???
ハッシュって何だっけ?
0429nobodyさん2008/11/21(金) 22:32:36ID:???
>>276
http://www.php.net/manual/ja/language.operators.php

型の概念が理解できているなら「===」と「!==」を使う事をお勧めしとく
0430nobodyさん2008/11/21(金) 22:37:01ID:???
>>201
http://www.php.net/manual/ja/reserved.variables.request.php
0431nobodyさん2008/11/21(金) 22:58:47ID:???
>>78
$j = strlen($char);
for($i=0, $i < $j; $i++)

>>76
http://www.asahi-net.or.jp/~wv7y-kmr/memo/php_security.html

>>73
何をpopen()してるのだろう?

>>55
PHP標準を使おうがDBを使おうが、セッションIDが漏れた時のリスクは一緒。
それでもDB等で自前の実装がしたいなら、session_set_save_handler()が便利だ。

携帯では接続の度にIP変わるから、IP使うのは駄目。
UserAgentはナンセンス。
各キャリアがもっている個体識別番号を使うといいよ。
DoCoMoでもユーザー認証無しでとれるようになったしね。
個体識別番号取れないようにしてる機種に対してはエラーを出すのを忘れない事。
0432nobodyさん2008/11/21(金) 23:58:42ID:???
↑かっこよすぎるw

てかID:zW/fBXPAは連日むかつくよ。
PHP以外の言語も知っているような口ぶりだけど
なんでそんなにえらそうな聞き方するんでしょう?
自分で調べようとしてなさそうだし
教えてもらったのならありがとうの一言くらい言えばいいのに。
0433たまちゃん ◆ExGQrDul2E 2008/11/22(土) 00:21:58ID:AbVJZ2V5
この掲示板のように、本文の改行数がn文字以上なら、省略と表示させたいのですが、
省略を表示する以前の文字が表示されません。
文字...略14としたいのです。
$mess = <<< FORM
文字列<br><br><br>あさささ<br>xf文字<br><br><br>czdvf
FORM;
$msgline = substr_count($mess, "<br>") + 1;
if ($msgline > 3) {
preg_match("/(.*) <br>.*/U", $mess, $match);
$message = $match[1]."<br> 省".$msgline."</a>";
}
echo "$message<hr>";
これでは、ただ(省)とだけ表示され、略される前の(文字列)と言う文字は表示されません
どのようにすればよいか、教えてください。
0434nobodyさん2008/11/22(土) 00:22:11ID:???
>>432
if (淡々と答える事が出来る) {
  淡々と答える;
} else {
  スルー;
}

>>428
「ハッシュテーブル」とかでググるといいよ。
まぁperlとかでは連想配列をハッシュと呼ぶのが通例だし細かい事は気にするな

>>425
require
PHP5ならautoloadなんかも上手く使うといい
0435nobodyさん2008/11/22(土) 00:34:45ID:???
>>433
$encoding = 'UTF-8'; // 実際は定数にする事
$str = 'オリジナルの文字列';
$len = 10;
$str2 = (mb_strlen($str, $encoding) > $len) ? mb_substr($str, 0, $len, $encoding) . '省略' : $str;
echo $str2;
0436nobodyさん2008/11/22(土) 00:37:03ID:???
>>433
preg_matchの中の<br>の手前にスペース入ってるよ
04374352008/11/22(土) 00:37:53ID:???
悪い。よく読んでなかった。

$num_br_max = 3;
$str = '文字列<br><br><br>あさささ<br>xf文字<br><br><br>czdvf';
$ary = preg_split('/<br>/i', $str);
$str2 = (count($ary) > $num_br_max) ? implode('<br>', array_slice($ary, 0, $num_br_max)) . '省略' : $str;
echo $str2;
0438nobodyさん2008/11/22(土) 00:39:50ID:???
>>435は質問よく読んでいない
更にmb関数使ってる癖にmb_strimwidthを使わない不思議ちゃん
04394382008/11/22(土) 00:40:46ID:???
っと、ごめん(´・ω・`)
0440nobodyさん2008/11/22(土) 00:42:12ID:???
>>438
おお。よく読んでなかったぞ。
しかもmb_strimwidth()とか知らなかったし。吊ってくる
0441nobodyさん2008/11/22(土) 00:45:58ID:???
>>434
スレが荒れるから回答者は全員スルーしたほうがいい
過去にも何度もあったことだ・・・
このままの調子だと
回答者はマナーのなってない質問者には回答してはならないっていうルールができてしまう
0442nobodyさん2008/11/22(土) 00:59:21ID:???
http://pc11.2ch.net/test/read.cgi/php/1213356756/l50
別スレに逃げ出したぞ
ほんと腐ってるね
0443nobodyさん2008/11/22(土) 01:04:30ID:???
>>431は遅漏すぎ
0444たまちゃん ◆ExGQrDul2E 2008/11/22(土) 01:19:45ID:AbVJZ2V5
>>437
ありがとうございました。
うまく動きました。
>>435
これだと、タグの途中で切れたら
意味がなくなるみたいです。
0445nobodyさん2008/11/22(土) 01:26:36ID:???
底辺で生きてる奴はちょっと自分が優位だと思うと豹変するんだよねぇ。
些細なミスをした店員を執拗に罵倒してる客とかたまに見るけど、
普段怒られてばっかで、怒ることに慣れてないから必要以上に相手を罵っちゃうんだろうな。
加減が分からないって可哀想だよね。
0446nobodyさん2008/11/22(土) 01:40:28ID:???
まんまお前のことじゃねえかw
0447nobodyさん2008/11/22(土) 02:36:26ID:???
ワロタ
0448nobodyさん2008/11/22(土) 16:01:33ID:ngL3J7iI
PHP5使えるレンタルサーバーで
広告が入らないところといったら、
一番安いのは、さくらになってしまうのかね?
0449nobodyさん2008/11/22(土) 16:15:10ID:???
>>448
板違い
その質問はレンタル鯖板で。
0450nobodyさん2008/11/22(土) 17:11:51ID:iSnXxlqn
最初、出だしの部分だけ表示して 「続きを読む」をクリックして
全文を表示させるようにしたいのですけど、どうやるのでしょう?
「続きを読む」という文にリンクをかけて、もう一つ全文記事を作って
そこで全部書けばいいのでしょうか?
0451nobodyさん2008/11/22(土) 17:35:35ID:???
トップページには出だしだけ切り取って表示すれば?
0452nobodyさん2008/11/22(土) 18:00:08ID:???
>>450
最近のMovableType4.2なんかだと「本文」と「続き」が別々のフォームで
保存も別にされてる様子。

1個の枠だけで「続きを読む」をやる場合は

まず本文の文字数をチェック。

本文が○文字より長い場合は、頭から○文字までを表示して
一番最後に「…」みたいな省略がある事を明示する文字を付け足して
レコードの個別IDを含んだ全文表示用リンクを表示する。

そうでない場合はそのまま表示する。

って感じだな。

記事の要約をトップページに表示したり
RSSへページの概要としても提供するなら
短い説明文と本文は分けて置いた方が良いと思う。

目次を表示する時に、各項目が「…」で省略されてるのは
クリックするまで中身が完結しないから、目次として微妙になってしまう。

わざと完結させないでPV増やすって技もあるかもしれないけど
他のサイトの方が読みやすければ廃れるのも早いと思われ。
0453nobodyさん2008/11/22(土) 20:48:34ID:MJ/AoE7Y
質問です。
ブラウザ経由ではなく、コマンドラインでPHPを対話的に操作したいのですが、

1. PHPの対話環境はありませんか?Rubyのirbのようなものです。
php -a は試しましたが、<?php ... ?> に囲まれないと出力されませんし、文
法エラーがあると強制終了だしで、実用に耐えませんでした。

2. 対話環境がないとしたら、 php -f PHPファイル名 しかないと思うのですが、
printのような関数で、最後に改行してくれるものはありませんか?
Java の System.out.println(), Ruby の puts のようなものです。
0454nobodyさん2008/11/22(土) 21:02:14ID:???
自己フォローです。2.については自己解決しました。
http://fdays.blogspot.com/2008/02/php5.html
対話的操作なら、var_dump()で良さそうです。
0455nobodyさん2008/11/22(土) 21:25:18ID:b7xKLs1N
ここを見てアップローダを作ろうとおもったのですが
ttp://w1.nirai.ne.jp/freeze/main/file09.html
----------------------------------------------
$updir = "./updir/";
 これが変数に保存用のフォルダを代入している部分です。

$filename = $_FILES['data']['name']
   これを、指定フォルダの中に保存するのが、
move_uploaded_file($_FILES['data']['tmp_name'], $updir.$filename)
   その後、echo命令で画像を表示しているわけです。

--------------------------------------------

$updir = "./updir/"の部分を他のサーバ、例えばhttp://www.example.com/down/
に保存したい場合、どのようにすれば良いでしょうか?

そのまま$updir = "./http://www.example.com/down/"とした時、アップロードするとエラーが出てしまいます。

0456nobodyさん2008/11/22(土) 21:27:11ID:???
無理です
0457nobodyさん2008/11/22(土) 22:03:15ID:P3cvCpOq
iisでphpを動かすのと
apache + mod_phpで動かすのだと
どっちの速度が速い?
0458nobodyさん2008/11/22(土) 22:03:44ID:???
場合による
0459nobodyさん2008/11/22(土) 22:05:15ID:???
>>455
他のサーバにアップロード用のプログラム用意して、socketで画像データをpostするとか
勿論セキュリティ上出来ない場合もあるだろうし、何より改変は変数一つ書き換えるだけでは済まない
0460nobodyさん2008/11/22(土) 22:11:43ID:???
他のサーバにPOSTするぐらいなら、ftpで保存先に送るシェルスクリプトを
流すようにした方が多分作るのは楽だろw
0461nobodyさん2008/11/22(土) 22:13:32ID:???
その保存したいサーバで実行すればいい
0462nobodyさん2008/11/22(土) 22:17:29ID:P3cvCpOq
>>458
どんな?
0463nobodyさん2008/11/22(土) 22:50:38ID:???
>>456>>459
そうなんですか・・・
有難うございました
0464nobodyさん2008/11/23(日) 08:59:40ID:7jpbyfc1
サーバーに test.php.jpgって感じのファイルでphpコードを書いたものを
アップしたんですが、phpとして実行されてしまうようです。
これは、Apacheの設定の問題でしょうか?

Apache/2.0.63 (CentOS)
php 5.1.x

httpd.confで下記のように設定しています
LoadModule php5_module modules/libphp5.so
AddHandler php5-script .php
AddType text/html .php
0465nobodyさん2008/11/23(日) 09:28:04ID:???
ファイル偽装したいけどできないってこと?

mod_mime_magicあたりが効いてるとかじゃないかな
0466nobodyさん2008/11/23(日) 10:12:13ID:7jpbyfc1
ありがとうございます

ファイル偽装を防ぎたいけど、
AddType image/png png
AddType image/gif gif
AddType image/jpeg .jpg jpeg
こんな感じで書いても phpinfoとか余裕で実行できちゃうんですよね。

LoadModule mime_magic_module modules/mod_mime_magic.so
LoadModule mime_module modules/mod_mime.so
# TypesConfig describes where the mime.types file (or equivalent) is
TypesConfig /etc/mime.types

でmime.typesの一覧にはちゃんとjpgも入ってるんですけど・・・

mod_mime_magicが先頭の数バイトを読んで、phpと判断してphpに処理を
渡しちゃうんですかね・・・
そうすると、スレチですか。。
0467nobodyさん2008/11/23(日) 10:40:35ID:7jpbyfc1
mod_mime_magic を外してみたんですが、一緒でした。
もう少し調べてみます
0468nobodyさん2008/11/23(日) 12:42:11ID:???
*nix系ならfileってコマンドでファイルのタイプが分かるよ。

うる覚えだけどPHPからシェルコマンド実行する場合は
配列かなんかで戻ってきて、確か1番目が名前かサイズ?で
2番目とかにファイルタイプが入ってた様な気がする。

もしかしたら改行で分割して自分で配列に入れてたかも。

まあ細かい手順はともかく、*nix系なら、
fileコマンドでチェックすれば、拡張子にかかわらずファイルのヘッダ見てくれる。
0469nobodyさん2008/11/23(日) 12:51:12ID:???
普通に設定してたらありえなくねー?
んなもんが余裕でできてたら今ごろ被害者続出だろ
0470nobodyさん2008/11/23(日) 16:42:57ID:???
質問です。
こんなコードが、問題なく動くようなのですが、PHPマニュアルのどこを見たら
この件が書かれているでしょうか?

<?php
class Test {
fuction() {
var_dump($this->hogehoge); // 定義に存在しないインスタンス変数にアクセス。
}
}

$test = new Test();
$test->hogehoge = 3;
var_dump($test->hogehoge); // 正常に実行。int(3)
$test->fugafuga(); // 正常に実行。iint(3)
?>

http://www.php.net/manual/ja/
PHP4、5の「クラスとオブジェクト」を読みましたが、載っていないようです。
0471nobodyさん2008/11/23(日) 16:43:21ID:I9fabXwC
あ、ID出し忘れました。
0472nobodyさん2008/11/23(日) 16:57:45ID:I9fabXwC
補足すると、この書き方はCakePHP1.2のソースを読んでいて見つけたものです。
0473nobodyさん2008/11/23(日) 17:01:02ID:???
定義しなきゃ代入しちゃだめなんて誰が言ってたの
0474nobodyさん2008/11/23(日) 17:15:59ID:I9fabXwC
以前知り合いから聞きました。
JavaやRubyではできませんから、自分もそうだと思ってました。

PHPマニュアルで、これに関する記述を探していますが見つかりません。
0475nobodyさん2008/11/23(日) 17:18:17ID:???
>問題なく動くようなのですが

お前試してないだろ
0476nobodyさん2008/11/23(日) 17:22:43ID:I9fabXwC
失礼。元のクラスは長かったので、編集しましたがミスしました。

<?php
class Test {
  function fugafuga() {
    var_dump($this->hogehoge);
  }
}

$test = new Test();
$test->hogehoge = 3;
var_dump($test->hogehoge);
$test->fugafuga();
?>
0477nobodyさん2008/11/23(日) 17:49:13ID:I9fabXwC
追加の質問です。
同じくcakeのソースで、このような記述が見つかりました。
変数名をパラメタライズしている点で、可変変数に似ています。
これについても、該当するPHPマニュアルを探しています。

class Test {
  var $hoge = 1;
  function fuga() {
    $x = "hoge";
    var_dump($this->$x); //これはOK。
  }
}

$test = new Test();
$test->fuga(); // OK。
$y = "hoge"
var_dump($test->$y); // これはNG.

特に知りたいのは、レシーバが $this なら実行できて、$testのような実変数
だと実行できない理由です。
0478nobodyさん2008/11/23(日) 18:17:42ID:???
>特に知りたいのは、レシーバが $this なら実行できて、$testのような実変数
だと実行できない理由です。
実行できない理由は、そういう風に作られているから
実行できないように作られた理由は、知らん
0479nobodyさん2008/11/23(日) 18:22:18ID:???
前の方の
>問題なく動くようなのですが
は親クラスで何か定義されてるんじゃないの?

>>477
「クラスの中」と「クラス内のメソッド」と「外」は、
それぞれスコープ違うよ。

じゃ無いとインスタンスの内部に保存した変数が
上書きされちゃって困るだろ。
0480nobodyさん2008/11/23(日) 18:33:47ID:???
732 名前: nobodyさん [sage] 投稿日: 2008/11/23(日) 17:51:46 ID:???
>>731
それはわかってますし、>>726でも「ローカル変数」って書いてます。
取り合えず>>730のスレにお越しください。

733 名前: nobodyさん [sage] 投稿日: 2008/11/23(日) 18:08:06 ID:???
喧嘩がしたかったようだね('A`)
734 名前: nobodyさん [sage] 投稿日: 2008/11/23(日) 18:12:23 ID:???
わざと喧嘩腰でデタラメ書いて、
顔真っ赤にした人が正解を書くのを釣るタイプ。

このタイプはもう飽きたよ。
735 名前: nobodyさん [sage] 投稿日: 2008/11/23(日) 18:12:48 ID:???
>>733
> 喧嘩がしたかったようだね('A`)

なんでそうなるのかぜんぜん理解できない。
誤解を訂正して誘導しただけじゃん。
736 名前: nobodyさん [sage] 投稿日: 2008/11/23(日) 18:14:32 ID:???
>>734
ぜんぜん釣りじゃないよ。
どこがデタラメなのか真剣に知りたいんだけど。
0481nobodyさん2008/11/23(日) 18:35:37ID:???
>>477
なんでCakePHPスレから
0482nobodyさん2008/11/23(日) 18:35:38ID:I9fabXwC
>>479
> は親クラスで何か定義されてるんじゃないの?

されていません。>>476のコードをお試しください。

> >>477
> 「クラスの中」と「クラス内のメソッド」と「外」は、
> それぞれスコープ違うよ。

それは知っています。私は元々Java屋です。
しかし、スコープが違うことと、
$this->変数 は実行できても、変数->変数 が実行できないこととは
あまり関係がないと思うのですが。


いずれにせよ、これらの機能は、フレームワークのソースで使われているわけ
ですから、undocumentedな隠し機能をではないだろうと思ったのですが、典拠
を見つけられなくて困っているのです。
0483nobodyさん2008/11/23(日) 18:49:20ID:I9fabXwC
>>480について、無視するのもあれなので説明しておきます。

【PHP】フレームワーク CakePHP 4ホール目【v1.2】
http://pc11.2ch.net/test/read.cgi/php/1213892680/699-

私はCakeスレの699です。ソースを読んでいて分からなかったことを質問しただ
けのつもりだったのですが、どうも意図が伝わらず、誤解を解こうとしたとこ
ろ、>>480のようなことになりました。

釣りや煽りの意図はまったくありませんが、意図が伝わらなくてイライラして
いたことは事実です。ごめんなさい。
0484nobodyさん2008/11/23(日) 18:58:46ID:???
class Test {
var $hoge = 1;
function fuga() {
$x = "hoge";
var_dump($this->$x); //これはOK。本来$thisは要らないけど、同じクラス内だから。
}
}

$test = new Test();
$test->fuga(); // OK。testインスタンス内のfugaメソッドを呼んでるから。
$y = "hoge"
var_dump($test->$y); // これはNG. $yはtestインスタンスの中に無いから。
0485nobodyさん2008/11/23(日) 19:08:59ID:???
可変変数は関係なくて、難しく考えすぎてるだけじゃないの?
0486nobodyさん2008/11/23(日) 19:12:17ID:???
>>477
やってみたけどvar_dump($test->$y);も実行できたよ(int(1))

> 特に知りたいのは、レシーバが $this なら実行できて、$testのような実変数
> だと実行できない理由です。
$y = "hoge"の末尾にセミコロンがない
0487nobodyさん2008/11/23(日) 19:13:15ID:I9fabXwC
>>484
>     var_dump($this->$x); //これはOK。本来$thisは要らないけど、同じクラス内だから。
細かいですが、$thisは要るでしょう?無ければ fuga()の出力は 1ではなく
"hoge"になってしまいます。

> var_dump($test->$y); // これはNG. $yはtestインスタンスの中に無いから。
ここが要点だと思うのですが、$testインスタンスの中の変数でしか、プロパティ
名のパラメタライズができないということでしょうか?

試してみました。
<?php
class Test {
  var $x = "hoge";
  var $hoge = 1;
  function fuga() {
    $x = "hoge";
    var_dump($this->$x); //これはOK。
    var_dump($this->{$this->x}); //これはOK。
  }
}

$test = new Test();
$test->fuga(); // OK。
var_dump($test->{$test->x});// OK。
?>

おお、最後の行もちゃんとint(i)が出力されます!ありがとうございます。
この件について、参考になる資料をご存知でしたら、教えていただけないでしょうか?

あと、どなたか >>470(>>476)についてもお願いいたします。
0488nobodyさん2008/11/23(日) 19:21:59ID:I9fabXwC
>>485-486
大正解…。自分も確認しました。セミコロンか…ごめんなさい。
プロパティ名はどこでも変数でパラメタライズできる、ということのようです。

メソッドでも行けますね。
$y = "fuga";
$test->$y(); //int(1)

ありがとうございました。よろしかったら資料をご紹介ください。

あと、どなたか >>470(>>476)についても。
0489nobodyさん2008/11/23(日) 19:29:12ID:???
ああ、意味分かったよ。ゴメソm(__)m

var_dump($test->$y);を
var_dump($test->y);
と思ってて、この人何言ってるんだろうと思ってた。

var_dump($test->hoge());が
$a = "hoge";
var_dump($test->$a());
って出来る筈なのに出来ないのは何故だーって話だったのか。
0490nobodyさん2008/11/23(日) 19:30:26ID:CCu6AGm0
PHPってスタンドアローンのアプリ作れますか?
0491nobodyさん2008/11/23(日) 19:34:59ID:???
>>490
できない、って書こうとしたが、調べたらできるようだ。

31. WinBinder でデスクトップアプリケーション:ITpro
http://itpro.nikkeibp.co.jp/article/COLUMN/20070402/267112/

> PHPで作れるGUIアプリケーションは、Webアプリケーションだけではありま
> せん。 WinbBnderを使えば、Windows上でデスクトップアプリケーションを作
> 成すること も可能です。
0492nobodyさん2008/11/23(日) 19:55:18ID:I9fabXwC
しつこく補足です。変数じゃなくて、リテラルでもOKでした。

$test->"fuga"(); // これはダメですが、
$test->{"fuga"}(); // これはOK!

しかし通常の関数は、変数じゃないとダメ。

function fugafuga() {
var_dump("fugafuga");
}
$y = "fugafuga";
$y(); // これはOK。
{"fugafuga"}(); //こっちはダメ。
?

どこにこの仕様は載ってるんでしょう!?
0493nobodyさん2008/11/23(日) 20:24:40ID:???
確かに、どこに書いてあるんでしょうねぇ。
リテラルの動作とブレスの動作はそれぞれ意味があって、
不思議とは思わないんでスルーしてましたけど、
どっかに公開されていてもいいはずですよね。
Zendのテストにはその手の設問は結構あるから、日本語化されていないどこかに
リソースがあるんでしょうけど。詳しい人いないですかね。自分も興味あります。
0494nobodyさん2008/11/23(日) 20:24:45ID:???
>>492
それは正式な仕様じゃないと思う。
おっぱいが式の前にパースされて、たまたま動いてるだけかと。

一手間増えても常に
$y = "fugafuga";
$hoge->$y;
にしておいた方が安全。
0495nobodyさん2008/11/23(日) 20:25:45ID:???
>>489
失礼、レスし忘れておりました。
私の質問の意図は、おっしゃるとおりです。

> と思ってて、この人何言ってるんだろうと思ってた。

Cakeスレの人たちもそのように誤解したのでしょうか。自分でははっきり書い
たつもりだったのですが、実際は分かりにくかったようです…。
0496nobodyさん2008/11/23(日) 20:28:25ID:???
書いてねーよ。内容といい嘘といい人に迷惑かけまくりな奴だな
0497nobodyさん2008/11/23(日) 20:30:02ID:???
あぁ、ちなみに、仕様がどこに書いてあるかは知らないけど
標準クラスの挙動が知りたいだけなら、Reflectionでソースを見ればだいたいわかる
0498nobodyさん2008/11/23(日) 20:30:32ID:DgqkQkfl
pagerの質問なんですが、現在のページの表示を変えられるということで
↓を試したんですが出来ませんでした。どこを直せばよいでしょうか?よろしくおねがいします。

<?php $data = array(
'1件目のデータ',
'2件目のデータ',
'3件目のデータ',
'4件目のデータ',);

require_once 'Pager/Pager.php';

$params = array(
'itemData' => $data,
'perPage'=> 2
"curPageSpanPre" => "[",
"curPageSpanPost" => "]"
);

$pager = & Pager::factory($params);

$pages = $pager->getPageData();
$links = $pager->getLinks();

foreach ($pager->getPageData() as $val) {
echo $val . '<br>';
}
echo '<p>' . $links['all'] . '</p>';
?>
0499nobodyさん2008/11/23(日) 20:35:19ID:???
> var_dump($test->hoge());が
> $a = "hoge";
> var_dump($test->$a());
> って出来る筈なのに出来ないのは何故だーって話だったのか。

出来るよ?
0500nobodyさん2008/11/23(日) 20:39:18ID:I9fabXwC
>>493
おお、興味を持ってくれた方が。
これはメタプログラミングに属する話題で、RailsのクローンであるCakeを成り
立たせた重要な技術だと思うんです。

>>494
そうですね。これは避けます。
そもそも、リテラルで呼び出すメリットはありませんから。
(関数名が固定だったら、直接 fugafuga() と書けば良い)。

>>496
書いてますので、冷静に読み直していただいたら、別の見解があるかもしれま
せん。つうか嘘って何?

>>497
よく分かりませんが、リフレクション機能のCのソースを読めとおっしゃってる
のでしょうか?


ご回答いただきありがとうございます。いったん所用でここを離れます。
0501nobodyさん2008/11/23(日) 20:58:52ID:???
>>500
>おお、興味を持ってくれた方が。
>これはメタプログラミングに属する話題で、RailsのクローンであるCakeを成り
>立たせた重要な技術だと思うんです。

get_class_vars
get_class
get_class_methods
call_user_func(array($obj, $method_name), $parameter);
辺りでどうにでもなると思うけど。
■ このスレッドは過去ログ倉庫に格納されています