質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

PEAR

PEAR (PHP Extension and Application Repository)はPHPで利用する事ができるライブラリです。

Q&A

解決済

1回答

1123閲覧

php5系からphp7系へ移行時にdo-whileが一回しか動作しない

Cake

総合スコア13

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

PEAR

PEAR (PHP Extension and Application Repository)はPHPで利用する事ができるライブラリです。

0グッド

1クリップ

投稿2021/08/27 00:45

編集2021/08/27 05:12

pear fileライブラリをphp7.2へ対応中なのですが、function next() 内のdo-whileがphp5.4ではループしているのに、php7.2では一度しか動作せずに悩んでいます。

do{...} while (!$error);は全ての処理後falseになって終了なので問題ないのですが、
2週目のdo{...} while (!$error);内のどこかで、php7.2場合の処理の仕方が違うようなので検証いたします。

do{...} while (($goodFile && $this->push()) || !$goodFile);がphp5.4ではtrue(ファイル名)>true(ディレクトリ名)>do{...} while (!$error);falseと正常に動作するのに対し、
php7.2ではtrue(ファイル名)>do{...} while (!$error);falseとディレクトリ名の処理が抜け落ちてしまいます。

調べた限りでは見当たらないのですが、php7.2でwhileの動作や条件式が変わったのでしょうか。
ご存知の方がおられましたら、ご回答よろしくお願いいたします。

php

1 function push() 2 { 3 $filename = $this->source->getFilename(); 4 if (substr($filename, -1) == '/') { //it's a directory 5 return false; 6 } 7 8 if ($this->uncompressionLevel >= 0 && 9 $this->baseDirCompressionLevel !== null && 10 count($this->readers) >= $this->uncompressionLevel 11 ) { 12 return false; 13 } 14 15 $extensions = explode('.', strtolower($filename)); 16 $reader =& $this->source; 17 $nbUncompressions = 0; 18 19 while (($extension = array_pop($extensions)) !== null) { 20 $nbUncompressions++; 21 unset($next); 22 $next = File_Archive::readArchive($extension, $reader, $nbUncompressions == 1); 23 if ($next === false) { 24 $extensions = array(); 25 } else { 26 unset($reader); 27 $reader =& $next; 28 } 29 } 30 if ($nbUncompressions == 1) { 31 return false; 32 } else { 33 $this->readers[count($this->readers)] =& $this->source; 34 unset($this->source); 35 $this->source = new File_Archive_Reader_ChangeName_AddDirectory( 36 $filename, $reader 37 ); 38 return true; 39 } 40 } 41 42 function next() 43 { 44 //debug_print_backtrace(); 45 if ($this->currentFileNotDisplayed) { 46 $this->currentFileNotDisplayed = false; 47 return true; 48 } 49 do { 50 do { 51 $selection = substr($this->baseDir, 0, $this->baseDirProgression); 52 if ($selection === false) { 53 $selection = ''; 54 } 55 56 $error = $this->source->select($selection, false); 57 if (PEAR::isError($error)) { 58 return $error; 59 } 60 if (!$error) { 61 if (empty($this->readers)) { 62 return false; 63 } 64 $this->source->close(); 65 unset($this->source); 66 $this->source =& $this->readers[count($this->readers)-1]; 67 unset($this->readers[count($this->readers)-1]); 68 } 69 } while (!$error); 70 71 $filename = $this->source->getFilename(); 72   //問題の箇所 73 if (strlen($filename) < strlen($this->baseDir)) { 74 $goodFile = (strncmp($filename, $this->baseDir, strlen($filename)) == 0 && 75 $this->baseDir{strlen($filename)} == '/'); 76 if ($goodFile) { 77 if (strlen($filename) + 2 < strlen($this->baseDirProgression)) { 78 $this->baseDirProgression = strpos($this->baseDir, '/', strlen($filename)+2); 79 if ($this->baseDirProgression === false) { 80 $this->baseDirProgression = strlen($this->baseDir); 81 } 82 } else { 83 $this->baseDirProgression = strlen($this->baseDir); 84 } 85 } 86 } else { 87 $goodFile = (strncmp($filename, $this->baseDir, strlen($this->baseDir)) == 0); 88 if ($goodFile) { 89 $this->baseDirProgression = strlen($this->baseDir); 90 } 91 } 92 } while (($goodFile && $this->push()) || !$goodFile); 93 94 return true; 95 } 96

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

FKM

2021/08/27 02:53

もっと具体的にphp5.xからphp7.xに換装したとか説明してもらってよろしいでしょうか。 php5でも5.2と5.3と5.6では挙動変わってる部分多いですし、 php7でも7.1以前と7.2以降ではかなり変わってる部分があったりします。
Cake

2021/08/27 04:13

php5.4とphp7.2のバージョンを追加いたしました。
guest

回答1

0

ベストアンサー

php7でwhileの動作や条件式が変わったのでしょうか。

というよりは
} while (($goodFile && $this->push()) || !$goodFile);
のどれかの変数、戻り値を生成する処理がPHP5→PHP7で異なる結果になっている可能性が高いかと思います。
下位互換性のない変更点の影響であったり、PHP5の動いている環境とPHP7の動いている環境の差異に起因するかもしれませんが、第三者が把握するのは難しいです。

まずは、$goodFile$this->push()が想定通りの値になっているかを確認してみてはいかがでしょうか。

投稿2021/08/27 02:05

tanat

総合スコア18716

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Cake

2021/08/27 05:08

`var_dump` で確認したところ、 php5.4では1回目 `$goodFile`は`true`で`$this->push()`も`true` 。2回目 `$goodFile`は`true`で`$this->push()`は`false`で `!$goodFile`が`false`で正常に終了。 php7.2では1回目 `$goodFile`は`true`で`$this->push()`も`true` 。2回目に行かずに終了。 上部の `do{` 直下で `echo` を試したところ、php7.2も`do{...} while (!$error);`の二週目に入っていましたので、この`do{...} while (!$error);`のどこかで動作が変になっているのがわかりましたので、もう少し検証いたします。 回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問