когда я иду в браузер в index.php, я получаю следующую ошибку
Fatal error: Method MyDirectoryIterator::__toString() must not throw an exception in /home/oussama/Desktop/CoursesTraining/OOPInPHP/index.php on line 0
когда я пытаюсь поймать исключение, я получаю ту же ошибку, так как я должен
знать, что такое исключение?
мой домашний каталог содержит два файла index.php и MyDirectoryIterator.inc.php,
Я использую композитор для обработки автозагрузки, и это исходный контент:
index.php
<?php
require_once './vendor/autoload.php';$files = new MyDirectoryIterator('../');
echo $files;
MyDirectoryIterator.inc.php
<?phpclass MyDirectoryIterator {
protected $_path;
protected $_files;
protected $_rfiles;
function __construct($path)
{
$this->_path = __DIR__ . '/' . $path;
$this->_files = new RecursiveDirectoryIterator($path);
$this->_files->setFlags(
FileSystemIterator::UNIX_PATHS |
FileSystemIterator::SKIP_DOTS
);
$this->_rfiles = new RecursiveIteratorIterator($this->_files);
}
function __toString()
{
$output = '';
foreach($this->_rfiles as $file)
{
$output .= $file . '<br />';
}
return $output;
}
}
когда я копирую содержимое __toString в __construct, код ведет себя как ожидалось.
так почему я получаю эту ошибку, когда я выполняю echo $files
из моего index.php?
есть идеи.
Вот как я могу решить эту проблему, если у кого-то возникла такая же проблема:
исключение произошло из-за отказа в доступе к некоторым файлам в листинге, поэтому я просто добавил блок try catch внутри метода __toString.
function __toString()
{
$output = '';
try {
foreach($this->_rfiles as $file)
{
$output .= $file . '<br />';
}
}
catch(Exception $e) {}
return $output;
}
странная вещь, которую я заметил, почему это исключение не выдается, когда я удаляю __toString () из класса и добавляю его логику в конструктор? все файлы перечислены без исключения?
Других решений пока нет …