我需要用PHP编写类。输入采用路径(目录名称)。该课程有两种方法:
我该怎么做?
答案 0 :(得分:3)
你不需要为此创建一个类。实际上,你不应该。这太复杂了,完全没必要。
如果您需要阅读目录中的文件列表,则有三个选项:readdir
,glob
或DirectoryIterator。
如果您需要阅读目录中的文件列表及其中的所有目录,那么您要使用RecursiveDirectoryIterator。
链接文档页面上有足够的用法示例。
使用这些,你可以获得你的list'o'files并构建你的HTML。
答案 1 :(得分:0)
非常简单的课程示例。
class MyFiles {
public static function files($path) {
// Logic used to get the files found at path and return an array
// Just use the built-in functionality of PHP
$filesArray = array();
if (!is_dir($path)) {
return $filesArray;
}
$dir = opendir($path);
while (false !== ($filename = readdir($dir))) {
if (!is_dir($filename)) {
$filesArray[] = $filename;
}
}
return $filesArray;
}
public static function table($path) {
$files = self::files($path);
$c_files = count($files);
if ($c_files == 0) {
return "<table><tbody><tr><td>No files at $path</td></tr></tbody></table>";
}
$table = "";
for ($i = 0; $i < $c_files; $i++) {
$table .= "<tr><td>{$files[$i]}</td></tr>";
}
return "<table><tbody>$table</tbody></table>";
}
}
$fileTable = MyFiles::table('/my/path/with/files');
答案 2 :(得分:0)
我认为为这样的functionaliteit创建一个类很好,因为你可以更好地预测它的行为,并在不同版本的PHP中进行微妙的变化。此外,您可以创建不同的类来读取其他位置(如数据库或csv文件)的文件列表。
在这种情况下,我从基类扩展了一个渲染器类,因为我认为渲染不应该是基类的一部分。实际上,为此创建一个单独的类可能更好,它使用Folder的任何后代来呈现它。但我会留给你找出最适合你的。
<?
class Folder
{
private $folder = '';
public function getFolder()
{
return $this->folder;
}
protected function setFolder($value)
{
$this->folder = (string)$folder;
}
public __construct($folder)
{
this->setFolder($folder);
}
public function readFileNames()
{
$folder = (string)$this->getFolder();
if ($folder === '')
{
throw new exception("Folder name is empty");
}
if (is_dir($folder) !== true)
{
throw new exception("'$folder' is not a directory.");
}
$dir = @opendir($this->folder);
if ($dir === false)
{
throw new exception("Cannot open directory '$folder'.");
}
$result = array();
while (false !== ($fileName = readdir($dir)))
{
if (is_file($fileName) === true)
{
$result[] = $fileName;
}
}
return $result;
}
public function readFiles()
{
$fileNames = $this->readFileNames();
$fileNames = array_flip($fileNames);
foreach($fileNames as $fileName=>&$fileContents)
{
if (false === ($file = @readFile($fileName)))
{
$fileContents = null;
}
else
{
$fileContents = $file;
}
}
}
}
class FolderTableRenderer extends Folder
{
public function renderTable()
{
?>
<table>
<thead><tr><th>File name</th></tr></thead>
<tbody>
<?
foreach ($this->readFileNames() as $fileName)
{
?>
<tr><td><?=$fileName?></td></tr>
<?
}
?>
</tbody>
</table>
<?
}
}