• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PHP declare文について、ticks指定回数の違いによる挙動差)

PHP declare文について、ticks指定回数の違いによる挙動差

このQ&Aのポイント
  • PHPのdeclare文において、ticks指定回数の違いによって挙動が異なります。具体的には、ticksを1回指定した場合と2回指定した場合で結果が異なります。
  • ticksを1回指定した場合、最後に余計な処理「print "|"が11回」が入る理由が分かりません。一方、ticksを2回指定した場合、余計な処理の数が減ります。
  • PHPのregister_tick_function関数とdeclare文を組み合わせることで、コードの実行中に指定した関数を定期的に実行することができます。ticksの指定回数によって、実行頻度が変わるため、結果も異なるのです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

恐らく、 declare文の前に、register_tick_functionを叩いた場合、 declare文で一度動作して、 declare文のブロックが終了したところで一度動作する、という挙動をしているようです。 逆にdeclare文内で、register_tick_functionを叩いた場合、それ(register_tick_function)自信が実行された時点で、動作してるので、その時点で一回増えます。 ■例1 <?php register_tick_function('mytick'); declare(tick=1) //ここが評価されて一回 { echo "test"; //ここで一回 }//ブロックが終了したということで一回 ?> ■例2 <?php declare(tick=1) //ここは評価されない { register_tick_function('mytick'); //ここは評価され一回 } //ブロックの終了で評価されて一回 ?> ■例3(declareは、{}を使わないで、declare();と記述することも出来る) <?php register_tick_function('mytick'); declare(tick=1); //ここでdeclareの評価+declareが閉じたということ(;)で計二回評価 ?> と、言ったところです。ただ、マニュアルを見てもイマイチよくわからなかったので、 体感での回答になります。 一度上記記述を含めて、いくつか試して見てください。

re999
質問者

お礼

回答ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 繰り返し文における小数の挙動

    以下のような簡単なプログラムを書いて実行させたところ、小数点表示の挙動がおかしくなりました。 ###プログラム ここから #!/usr/bin/perl use strict; use warnings; for(my $i=0.01;$i<=1;$i+=0.001) { print $i,"\n"; } ###ここまで ##結果 ここから . . . 0.685 0.686 0.687 0.688000000000001 0.689000000000001 0.690000000000001 ##ここまで 以上のように、0.001づつ増加する $i に途中から000000000001が加わってしまいます。この000000000001が足される現象をやめさせたいです。原因、解決策等おわかりであれば教えていただけないでしょうか。よろしくお願いします。

    • ベストアンサー
    • Perl
  • 配列のコピー及び printの .と,の挙動の違い

    以下、Perlの仕様についてわからないことが2点あります。 1) 配列のコピーは実態をコピーするようですが、参照扱いになるのは引数で与えた時でしょうか? 2) 下の例で@aは 6という個数を返し、@bは 1bcという配列の中身を返します。printの.と,で挙動が変わる理由が知りたいです。 例) my @a = qw(1 2 3 a b c); my @b = @a; splice @b, 1, 3; print @a . "\n"; # 6 print @b , "\n"; # 1bc

    • ベストアンサー
    • Perl
  • phpのfor文先頭の式内での0x1、0x2とは

    phpのfor文に関して質問させて頂きます。 phpのリファレンスを見ていて、分からない事があります。 [ PHP マニュアル > 言語リファレンス クラスとオブジェクト ] http://php.net/manual/ja/language.oop5.php こちらの「User Contributed Notes」の14 redrik at gmail dot comの中に、以下のようなfor文があります。 class FlagsEnum extends Enum { public function __construct( /*...*/ ) { $args = func_get_args(); for( $i=0, $n=count($args), $f=0x1; $i<$n; $i++, $f *= 0x2 ) $this->add($args[$i], $f); } } この for( $i=0, $n=count($args), $f=0x1; $i<$n; $i++, $f *= 0x2 ) の部分ですが、結果を見ると、$fの値を2倍しながらループさせるという感じなのですが、それであれば、なぜ for( $i=0, $n=count($args), $f=1; $i<$n; $i++, $f *= 2 ) と書かないのでしょうか? もしかすると値を単純に2倍にしているわけではないのでしょうか? 詳しい方がいらっしゃいましたら、ご教示を宜しくお願いいたします。

    • 締切済み
    • PHP
  • PHP の PRINT 文の変数部分の表示がおかしい。 <?php print 大連 ; ?>などと表示.

    PHPで初めてメールのプログラムを作っていますが、$txtLastName の変数にある文字をform から「大連 」を入力後、にそうすると、確認のため PRINT してみたら、以下のようになってしまいました。 しまいます。 「大連」 は変数の内容で表示したい文字ですが、「<?php print」と「; ?>」は表示してもらいたくありません。カナはデータ入力なしの場合です。 どうやったら、解決できるでしょうか? ------- PHP のソース部分 $emailtxt = "姓名:\t"; $emailtxt .= $txtLastName; $emailtxt .= "\nカナ:\t"; $emailtxt .= $txtFirstName; ・・・・・・・ print $emailtxt; --ソース部分はここまで-----  《ホームから姓名として大連を入力したとすると》 -----表示結果----- 姓名: <?php print 大連 ; ?> カナ: <?php print; ?> 性別 男性M 女性F: 出生年月日: 年 月 日国籍: 出生国名:・・・・・・

  • foreach 文での行指定方法

    はじめましてこんばんはm(_ _)m いろいろ検索してみましたが解決出来ませんでしたので何卒ご教授願います。 あるフリーのcgiを利用させてもらっているのですが一部改造したいと思っております。 cgiはフォームメール用で以下のプログラムによってhtml側のデータを読み取ってくれます。この時にhtml側のデータを全て読み取ってくれるのですが一部のみを抜粋して上から順に表示させたいと思います。 例えばhtml側が以下の3項目でこの順番だとして()内はNAMEです。 【html側】 質問=NAME属性(A) 名前=NAME属性(B) 電話=NAME属性(C) これをメールで受け取った時に以下のメール文のようにNAME属性(B)が先頭に来るようにしたいのです。 【メール文】 (B)= 山田太郎 (C)=0123456789 (A)=好きな食べ物はイチゴ (B)の行が上から何番目という様に指定する方法では出来るのですが複数ファイルがあり(B)の行番号が変動する為指定出来ません。 【html側】が以下のようになっているとして以下のプログラムはどのように指定すればよろしいですか?当方初心者の為質問内容が分かりにくいかと存じますが何卒よろしくお願いいたします。 質問=NAME属性(A) 名前=NAME属性(B) 電話=NAME属性(C) foreach (0..$count-1) { if ($DATA_V[$_] =~ /\n/) { &jis("$DATA_N[$_] =\n\n$DATA_V[$_]\n"); print OUT "$msg\n"; } else { &jis("$DATA_N[$_] =$DATA_V[$_]"); print OUT "$msg\n"; } }

    • 締切済み
    • CGI
  • PHP5でCSVの指定行データだけを取得するには?

    PHP初心者です。 下記のような方法で全てのデータを取得する方法があると知りました。 $fp = fopen("url.csv", "r"); while ($data = fgetcsv($fp, 1)) { foreach ($data as $d) { print $d . "<br>\n"; } } しかし指定行、例えば10行目等だけを取得する方法がわかりません。 CSVは1列で1000行ほどあります。 恐れ入りますが具体的なソースを教えてくださいませ。

    • ベストアンサー
    • PHP
  • 【PHP】declare命令で”Fatal err

    【PHP】declare命令で”Fatal error”が”出ます。 strict_typesディレクトリに1を与え厳密な型チェックを有効にしようとし、 以下のようPHPを記述しました。 すると "Fatal error: strict_types declaration must be the very first statement in the script in C:\xampp\htdocs\myPHP\●●●\●●●\main.php on line 4" と出ます。一番最初に記述し、スペルミスもないように思えますが何度やってもお同じです。今、引数や戻り値に型を指定する「型宣言」あたりを学習しています。 ------- <?php declare(strict_types=1); function getTriangleArea(float $base, float $height):float{ return $base * $height / 2; } $area = getTriangleArea(10.8, 10); print "三角形の面積は{$area}m2です!"; ?> ------- ちなみに"declare(strict_types=1);"の部分をコメントアウトすると添付画像のようにちゃんと表示されます。 declare(strict_types=1); の使い方を間違えているのでしょうか? 原因の分かる方いらっしゃいましたら教えてください。

    • ベストアンサー
    • PHP
  • whileで処理した結果を変数に入れる方法

    PHP初心者です。 教えてください。 以下の実行結果が「5 4 3 2 1」です。 <?php $a=5; while ($a > 0) { print $a; print "\n"; $a--; } ?> 「5 4 3 2 1」をprintせずに変数に入れたいのですが、どうすればいいのでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPを勉強中なのですが一点わからない部分が

    現在PHPを勉強中なのですがちょっと分からない部分がありまして質問します。 例題1は引数を指定してもしなくても実行すればHello Worldと表示されます。 しかし例題2は引数($var)を指定しないとエラーとなります。 この違いはなんでしょうか?私には同じに見えますが・・。 例題1 <?php function somefunc(){ print ( "Hello World" ); }; somefunc(); ?> 例題2 <?php function my_print_r( $var ){ echo "<pre>"; print_r( $var ); / echo "</pre>"; }; $name = array("sophy","nancy","angera"); my_print_r($name); ?>

    • ベストアンサー
    • PHP
  • phpでファイルが削除できない

    こんにちは。 ファイル名の書かれたdir.txtを開いて、その中から1日以上経過したファイルを削除するtime.phpを作成しようと思っています。 実行してみると、24時間経過したファイルがあっても 「Warning: unlink() [function.unlink]: Permission denied in C:\Program Files\xampp\htdocs\test\time.php on line 33」 というエラーがでて削除できない 実行結果にprintするように指定していない$imaの数値「1128673152」が表示される。 のですが、どこに間違いがあるのでしょうか? time.phpの内容 ---------------------------------------------------------------------- <html> <body> <?php // ファイルを読み込み専用でオープンする $fp = fopen('dir.txt', 'r'); // 終端に達するまでループ while (!feof($fp)) { // ファイルから一行読み込む $line = fgets($fp); $line = rtrim($line); // ファイルの更新時間を調べる $kousin = filemtime("$line"); // 今の時刻 $ima = time(); // 経過時間を計算する $keika = $ima - $kousin; // 出力する print $line; print "<br>\n"; print $ima; print "<br>\n"; print $kousin; print "<br>\n"; print $keika; print "<br>\n"; clearstatcache(); if ( $keika > 86400 ) { unlink( "$file" ); } } // ファイルをクローズする fclose($fp); ?> </body> </html> ----------------------------------------------------------------------

    • ベストアンサー
    • PHP