2017-02-19 2 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); 
    } 
} 

Является ли проблема, что каталог не существует? Было бы лучше, чтобы проверить это, прежде чем пытаться открыть, а также позволит, что делать, если она действительно существует, но вы не можете на самом деле читать:

<?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); 
    } 
} 

Я добавил error_reporting(E_ALL & ~E_NOTICE); в примерах, как это было бы убедиться, что вы видите ошибки и можете отладить вашу проблему. Больше информации об этом здесь: http://php.net/manual/en/function.error-reporting.php

+0

Спасибо, установка '$ this-> list_of_files [$ entry]' в цикле while завершилась неудачно, частный массив, объявленный как свойство объекта, остается неинициализированным. – 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, в противном случае вы делаете локальную переменную. Вы делаете это в одном месте, но, например, не здесь

return empty($list_of_files); 

Поскольку эта переменная никогда не установлена, это всегда будет возвращать то же самое.

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. Я был неясен с моим вопросом; установка '$ this-> list_of_files [$ entry]' в цикле while терпит неудачу, частный массив, объявленный как свойство объекта, остается неинициализированным. – Ralph

+0

Я понятия не имею, что вы имеете в виду, или как вы это проверяете. вы должны, вероятно, изучить некоторые основные отладки, а затем точно сказать, что происходит не так, и что такое ошибка. Во всяком случае, сначала исправьте свой код с помощью свойств, id 'say – Nanne

Смежные вопросы