2017-02-19 7 views
1

プライベートアレイ$list_of_filesは未初期化のままです。 whileループからどのように更新できますか?ローカル変数は未初期化のままです

class listOfFiles { 
private $list_of_files = []; 

function __construct() { 
    if ($handle = opendir(WEB_STORAGE_DIR)) { 

    while (false !== ($entry = readdir($handle))) { 
     $this->list_of_files[$entry] = filesize(WEB_STORAGE_DIR.DIRECTORY_SEPARATOR.$entry); 
    } 

    closedir($handle); 

    // Remove . and .. from the list 
    unset($list_of_files['.']); 
    unset($list_of_files['..']); 
    } 
} 

function is_empty() { 
    return empty($list_of_files); 
} 
} 

答えて

0

$list_of_filesようになりされます変数を参照すると、$this->list_of_filesとなるプロパティと同じではありません。

変数は、関数内で参照されている機能でのみ使用可能です/宣言(グローバル使用しない限り - しかし、これは一般に「悪」とみなされ、避けるべきである)

プロパティは、クラスのすべてのメソッド(から入手できます静的でない限り)、オブジェクトの存続期間中存続します。

<?php 
//lets show all error so we can see if anything else is going on.. 
error_reporting(E_ALL & ~E_NOTICE); 

class listOfFiles { 
    private $list_of_files = []; 

    function __construct() { 
     if ($handle = opendir(WEB_STORAGE_DIR)) { 

     while (false !== ($entry = readdir($handle))) { 
      $this->list_of_files[$entry] = filesize(WEB_STORAGE_DIR.DIRECTORY_SEPARATOR.$entry); 
     } 

     closedir($handle); 

     // Remove . and .. from the list 
     unset($this->list_of_files['.']); 
     unset($this->list_of_files['..']); 
     } 
    } 

    function is_empty() { 
     return empty($this->list_of_files); 
    } 
} 

ディレクトリが存在しないという問題はありますか?開こうとする前にこれをチェックし、またそれが存在しない場合にどうするかを可能にする方が良いでしょうが、あなたは実際にそれを読んカント:私はこれがそのことを確認してくださいと同じように例にerror_reporting(E_ALL & ~E_NOTICE);を追加した

<?php 
//lets show all error so we can see if anything else is going on.. 
error_reporting(E_ALL & ~E_NOTICE); 

class listOfFiles { 
    private $list_of_files = []; 

    function __construct() { 
     if(!is_dir(WEB_STORAGE_DIR)){ 
     throw new Exception("Missing Web Storage Directory"); 
     } 
     $handle = opendir(WEB_STORAGE_DIR); 
     if (!$handle) { 
     throw new Exception("Could not read Web Storage Directory"); 
     } 
     else{ 

     while (false !== ($entry = readdir($handle))) { 
      $this->list_of_files[$entry] = filesize(WEB_STORAGE_DIR.DIRECTORY_SEPARATOR.$entry); 
     } 

     closedir($handle); 

     // Remove . and .. from the list 
     unset($this->list_of_files['.']); 
     unset($this->list_of_files['..']); 
     } 
    } 

    function is_empty() { 
     return empty($this->list_of_files); 
    } 
} 

エラーが表示され、問題をデバッグするのに役立ちます。これに関する詳しい情報はこちらhttp://php.net/manual/en/function.error-reporting.php

+0

ありがとう、whileループの '$ this-> list_of_files [$ entry]'の設定が失敗すると、オブジェクトのプロパティとして宣言されたプライベート配列は未初期化のままです。 – Ralph

+0

パスが有効であることを確認してください - WEB_STORAGE_DIRはどこから来たのですか?代わりに '__DIR__'を使ってテストしましたが、実行中のファイルのディレクトリを指しています。ここのサンプルコードを見てください。http://pastebin.com/gAAzZSr6 – Theo

+0

whileループでは失敗しますエラーや警告はありますか?ファイルの先頭に 'error_reporting(E_ALL&〜E_NOTICE);を追加して、エラーを確認してください - これに関する詳細はこちら:http://php.net/manual/en/function.error-reporting.php – Theo

0

アクセスプロパティは、あなたがそれ以外の場合は、ローカル変数を作っている、$thisを使用する必要があります。これは1か所で行いますが、たとえばここにはありません

この変数は決して設定されないので、これは常に同じものを返します。

return empty($this->list_of_files); 

同じ完全なコードを作る、そのプロパティへの他の参照のために行く(あなたが検証可能なものを提供しなかったとして、これは、当然のテストされていません)この

class listOfFiles { 
    private $list_of_files = []; 

    function __construct() { 
    if ($handle = opendir(WEB_STORAGE_DIR)) { 

     while (false !== ($entry = readdir($handle))) { 
     $this->list_of_files[$entry] = filesize(WEB_STORAGE_DIR.DIRECTORY_SEPARATOR.$entry); 
     } 

     closedir($handle); 

     // Remove . and .. from the list 
     unset($this->list_of_files['.']); 
     unset($this->list_of_files['..']); 
    } 
    } 

    function is_empty() { 
    return empty($this->list_of_files); 
    } 
} 
+0

ありがとう、私は、$ this - > ... 'がreturnステートメントにありません。私は私の質問に不明でした。 whileループの '$ this-> list_of_files [$ entry]'の設定が失敗すると、オブジェクトのプロパティとして宣言されたプライベート配列は初期化されずに残ります。 – Ralph

+0

私はあなたが何を意味するか、またはこれをどのようにテストするかという手がかりを持っていません。おそらく何らかの基本的なデバッグに目を通し、何がうまくいかないのか、そしてそのエラーが何であるかを正確に伝えるべきです。とにかく、あなたのコードを最初にプロパティーで修正してください。id ' – Nanne

関連する問題