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
回答1件
あなたの回答
tips
プレビュー