• ベストアンサー

PHPで定義されるあるクラスの関数について

お世話になります。自分がいま勉強しているPHP教本の中の、画像ファイルをアップロードするクラスUploadを以下に掲載します。 自分の質問は この中のcheckFile()という関数についてです。 それぞれがtrueまたはfalseを返す3つの関数を続けて実行していますが、すべての戻り値がtrueでなければtrueを返せないはずなのに、ここでは一番最後のcheckType()がtrueであれば前の2つはfalseでも構わないことになってしまいます。それぞれの戻り値である$accept を順次かけ合わせていけば問題ないように思われますが、そうではなくて、それぞれを単純に$accept に代入するだけでよいのでしょうか? 詳しい方、どうかご意見をお聞かせください。 class Upload{ protected $destination; protected $max = 81920; protected $messages = [];// error or success message, to show to the user protected $permitted = ['image/gif', 'image/jpeg', 'image/pjpeg', 'image/png', 'image/webp' ]; // to check if the uploaded file is one of these types public function __construct($path){ if(is_dir($path) && is_writable($path)){ $this->destination = rtrim($path, '/\\').DIRECTORY_SEPARATOR; }else{ throw new \Exception("$path must be a valid, writable directory.") } } public function upload($fieldname){ $uploaded = $_FILES[$fieldname]; if($this->checkFile($uploaded)){ // child function 1 $this->moveFile($uploaded); // child function 2 } } protected function checkFile($file){ // child function 1 $accept = $this->getErrorLevel($file); $accept = $this->checkSize($file); $accept = $this->checkType($file); return $accept; } protected function moveFile($file){ // $file is the same as $uploaded in parent function $success = move_uploaded_file($file['tmp_name'], $this->destination.$file['name']); if($success){ $result = $file['name'] .' was uploaded successfully.'; $this->messages[] = $result; }else{ $this->messages[] = 'Could not upload '.$file['name']; } } public function getMessages(){ return $this->messages; } protected function getErrorLevel($file){ switch($file['error']){ case 0: return true; case 1: case 2: $this->messages[] = $file['name'].' is too big. (max: '.$this->getMaxSize().')'; break; case 3: $this->messages[] = $file['name'].' was only partially uploaded.'; break; case 4: $this->messages[] = 'No file was submitted.'; break; default: $this->messages[] = 'Sorry. There was a problem uploading '.$file['name']; } return false; } protected function checkSize($file){ if($file['error'] == 1 || $file['error'] == 2 ){ return false; }else if($file['size'] == 0){ $this->messages[] = $file['name']. " is an empty file."; return false; }else if($file['size']>$this->max){ $this->messages[] = $file['name']." exceeds the maximum size for a file (". $this->getMaxSize().")"; return false; } return true; } protected function checkType($file){ if(!in_array($file['type'], $this->permitted)){ $this->messages[] = $file['name']." is not permitted type of file."; return false; } return true; } public function getMaxSize(){ return number_format($this->max/1024, 1)." KB"; } }

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

  • ベストアンサー
  • asciiz
  • ベストアンサー率70% (6803/9674)
回答No.1

>それぞれを単純に$accept に代入するだけでよいのでしょうか? 確かにおかしい気がしますね。 2つ目・3つ目を &= に変えた > $accept = $this->getErrorLevel($file); > $accept &= $this->checkSize($file); > $accept &= $this->checkType($file); にすれば、いずれかでエラーになったならばエラー、と返せるんじゃないかと思います。

papashiroSooke
質問者

お礼

早速にご回答をいただき、有難うございます。確かにおかしいですよね。自分もこれは出版社の誤植ではないかと考えていました。&= で戻り値をつないでいけば正しい結果を得られると思います。

Powered by GRATICA

関連するQ&A

専門家に質問してみよう