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

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

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

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

PEAR

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

解決済

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

Cake
Cake

総合スコア13

PHP

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

PEAR

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

1回答

0リアクション

1クリップ

633閲覧

投稿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

function push() { $filename = $this->source->getFilename(); if (substr($filename, -1) == '/') { //it's a directory return false; } if ($this->uncompressionLevel >= 0 && $this->baseDirCompressionLevel !== null && count($this->readers) >= $this->uncompressionLevel ) { return false; } $extensions = explode('.', strtolower($filename)); $reader =& $this->source; $nbUncompressions = 0; while (($extension = array_pop($extensions)) !== null) { $nbUncompressions++; unset($next); $next = File_Archive::readArchive($extension, $reader, $nbUncompressions == 1); if ($next === false) { $extensions = array(); } else { unset($reader); $reader =& $next; } } if ($nbUncompressions == 1) { return false; } else { $this->readers[count($this->readers)] =& $this->source; unset($this->source); $this->source = new File_Archive_Reader_ChangeName_AddDirectory( $filename, $reader ); return true; } } function next() { //debug_print_backtrace(); if ($this->currentFileNotDisplayed) { $this->currentFileNotDisplayed = false; return true; } do { do { $selection = substr($this->baseDir, 0, $this->baseDirProgression); if ($selection === false) { $selection = ''; } $error = $this->source->select($selection, false); if (PEAR::isError($error)) { return $error; } if (!$error) { if (empty($this->readers)) { return false; } $this->source->close(); unset($this->source); $this->source =& $this->readers[count($this->readers)-1]; unset($this->readers[count($this->readers)-1]); } } while (!$error); $filename = $this->source->getFilename();    //問題の箇所 if (strlen($filename) < strlen($this->baseDir)) { $goodFile = (strncmp($filename, $this->baseDir, strlen($filename)) == 0 && $this->baseDir{strlen($filename)} == '/'); if ($goodFile) { if (strlen($filename) + 2 < strlen($this->baseDirProgression)) { $this->baseDirProgression = strpos($this->baseDir, '/', strlen($filename)+2); if ($this->baseDirProgression === false) { $this->baseDirProgression = strlen($this->baseDir); } } else { $this->baseDirProgression = strlen($this->baseDir); } } } else { $goodFile = (strncmp($filename, $this->baseDir, strlen($this->baseDir)) == 0); if ($goodFile) { $this->baseDirProgression = strlen($this->baseDir); } } } while (($goodFile && $this->push()) || !$goodFile); return true; }

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

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のバージョンを追加いたしました。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

PHP

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

PEAR

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