致命错误:无法在第232行的unzipper.php中访问空属性

时间:2015-03-15 09:54:11

标签: php html web-services fatal-error

我正在创建一个php脚本解压zip和.gz档案,但我收到了上述错误。我知道错误是在最后一行的某处,但我无法追查它。

<?php
        /**
         * The Unzipper extracts .zip archives and .gz files on webservers. It's handy if you
         * do not have shell access. E.g. if you want to upload a lot of files
         * (php framework or image collection) as archive to save time.
         */

        $timestart = microtime(TRUE);

        $arc = new Unzipper;

        $timeend = microtime(TRUE);
        $time = $timeend - $timestart;

        class Unzipper {
          public $localdir = '.';
          public $zipfiles = array();
          public static $status = '';

          public function __construct() {

            //read directory and pick .zip and .gz files
            if ($dh = opendir($this->localdir)) {
              while (($file = readdir($dh)) !== FALSE) {
                if (pathinfo($file, PATHINFO_EXTENSION) === 'zip'
                  || pathinfo($file, PATHINFO_EXTENSION) === 'gz'
                ) {
                  $this->zipfiles[] = $file;
                }
              }
              closedir($dh);

              if(!empty($this->zipfiles)) {
                self::$status = '.zip or .gz files found, ready for extraction';
              }
              else {
                self::$status = '<span style="color:red; font-weight:bold;font-size:120%;">Error: No .zip or .gz files found.</span>';
              }
            }

            //check if an archive was selected for unzipping
            //check if archive has been selected
            $input = '';
            $input = strip_tags($_POST['zipfile']);

            //allow only local existing archives to extract
            if ($input !== '') {
              if (in_array($input, $this->zipfiles)) {
                self::extract($input, $this->localdir);
              }
            }
          }

          public static function extract($archive, $destination) {
            $ext = pathinfo($archive, PATHINFO_EXTENSION);

            if ($ext === 'zip') {
              self::extractZipArchive($archive, $destination);
            }
            else {
              if ($ext === 'gz') {
                self::extractGzipFile($archive, $destination);
              }
            }

          }

          /**
           * Decompress/extract a zip archive using ZipArchive.
           *
           * @param $archive
           * @param $destination
           */
          public static function extractZipArchive($archive, $destination) {
            // Check if webserver supports unzipping.
            if(!class_exists('ZipArchive')) {
              self::$status = '<span style="color:red; font-weight:bold;font-size:120%;">Error: Your PHP version does not support unzip functionality.</span>';
              return;
            }

            $zip = new ZipArchive;

            // Check if archive is readable.
            if ($zip->open($archive) === TRUE) {
              // Check if destination is writable
              if(is_writeable($destination . '/')) {
                $zip->extractTo($destination);
                $zip->close();
                self::$status = '<span style="color:green; font-weight:bold;font-size:120%;">Files unzipped successfully</span>';
              }
              else {
                self::$status = '<span style="color:red; font-weight:bold;font-size:120%;">Error: Directory not writeable by webserver.</span>';
              }
            }
            else {
              self::$status = '<span style="color:red; font-weight:bold;font-size:120%;">Error: Cannot read .zip archive.</span>';
            }
          }

          /**
           * Decompress a .gz File.
           *
           * @param $archive
           * @param $destination
           */
          public static function extractGzipFile($archive, $destination) {
            // Check if zlib is enabled
            if(!function_exists('gzopen')) {
              self::$status = '<span style="color:red; font-weight:bold;font-size:120%;">Error: Your PHP has no zlib support enabled.</span>';
              return;
            }

            $filename = pathinfo($archive, PATHINFO_FILENAME);
            $gzipped = gzopen($archive, "rb");
            $file = fopen($filename, "w");

            while ($string = gzread($gzipped, 4096)) {
              fwrite($file, $string, strlen($string));
            }
            gzclose($gzipped);
            fclose($file);

            // Check if file was extracted.
            if(file_exists($destination . '/' . $filename)) {
              self::$status = '<span style="color:green; font-weight:bold;font-size:120%;">File unzipped successfully.</span>';
            }
            else {
              self::$status = '<span style="color:red; font-weight:bold;font-size:120%;">Error unzipping file.</span>';
            }

          }
        }

        ?>

        <!DOCTYPE html>
        <head>
          <title>File Unzipper</title>
          <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
          <style type="text/css">
            <!--
            body {
              font-family: Arial, serif;
              line-height: 150%;
            }

            fieldset {
              border: 0px solid #000;
            }

            .select {
              padding: 5px;
              font-size: 110%;
            }

            .status {
              margin-top: 20px;
              padding: 5px;
              font-size: 80%;
              background: #EEE;
              border: 1px dotted #DDD;
            }

            .submit {
              -moz-box-shadow: inset 0px 1px 0px 0px #bbdaf7;
              -webkit-box-shadow: inset 0px 1px 0px 0px #bbdaf7;
              box-shadow: inset 0px 1px 0px 0px #bbdaf7;
              background: -webkit-gradient(linear, left top, left bottom, color-stop(0.05, #79bbff), color-stop(1, #378de5));
              background: -moz-linear-gradient(center top, #79bbff 5%, #378de5 100%);
              filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#79bbff', endColorstr='#378de5');
              background-color: #79bbff;
              -moz-border-radius: 4px;
              -webkit-border-radius: 4px;
              border-radius: 4px;
              border: 1px solid #84bbf3;
              display: inline-block;
              color: #ffffff;
              font-family: arial;
              font-size: 15px;
              font-weight: bold;
              padding: 10px 24px;
              text-decoration: none;
              text-shadow: 1px 1px 0px #528ecc;
            }

            .submit:hover {
              background: -webkit-gradient(linear, left top, left bottom, color-stop(0.05, #378de5), color-stop(1, #79bbff));
              background: -moz-linear-gradient(center top, #378de5 5%, #79bbff 100%);
              filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#378de5', endColorstr='#79bbff');
              background-color: #378de5;
            }

            .submit:active {
              position: relative;
              top: 1px;
            }

            /* This imageless css button was generated by CSSButtonGenerator.com */

            -->
          </style>
        </head>

        <body>
        <h1>Archive Unzipper</h1>

        <p>Select .zip archive or .gz file you want to extract:</p>

        <form action="" method="POST">
          <fieldset>

            <select name="zipfile" size="1" class="select">
              <?php foreach ($arc->zipfiles as $zip) {
                echo "<option>$zip</option>";
              }
              ?>
            </select>

            <br/>

            <input type="submit" name="submit" class="submit" value="Unzip Archive"/>

          </fieldset>
        </form>
        <p class="status">
         //Line with error
          Status: <?php return $arc->$status; ?>
          <br/>
          Processingtime: <?php echo $time; ?> ms
        </p>
        </body>
        </html>

我不知道我哪里出错了。

1 个答案:

答案 0 :(得分:0)

这很可能就是问题所在:

Status: <?php return $arc->$status; ?>

请尝试这样:

Status: <?php return $arc->status; ?>

请注意&#34;状态&#34; ...

之前缺少的$