gpt4 book ai didi

PHP实例化子类

转载 作者:可可西里 更新时间:2023-10-31 22:14:49 25 4
gpt4 key购买 nike

我想在这里成为一名面向对象的编码员,所以我给自己布置了一些简单的任务。
我构建了一个类来显示给定目录中的所有图像。这工作得很好,所以我将该类分成两个类,一个用于读取目录中的文件名并将它们传递到一个数组中,另一个用于解析该数组并显示图片。子类中的方法与父类中的方法完全相同(当然除了用 parent::代替 this->)。

现在似乎当我实例化子类并调用它的方法时,什么也没有发生。

类:

class Picfind
{
public function findPics($dir){
$files = array();
$i=0;
$handle = opendir($dir);
while (false !== ($file = readdir($handle))){
$extension = strtolower(substr(strrchr($file, '.'), 1));
if($extension == 'jpg' || $extension == 'gif' || $extension == 'png'){
// now use $file as you like
$i++;
$files['file' . $i] = $file;
}
}
return $files;
}
}

class DisplayPics extends Picfind
{

function diplayPics($dir)
{
echo 'displayPics method called';

foreach(parent::findPics($dir) as $key => $val) {
echo '<img src="' . $dir . $val . '" img><br/>';
}
}
}

实例化:

include("class.picFind.php");
$Myclass = new DisplayPics();
$Myclass->displayPics('./images/');

最佳答案

老实说:你的整个设计都是错误的。

  1. DisplayPics 不应该从 Picfind 继承。 老实说,要么让 Picfind 有显示方法,要么让 DisplayPicsPicfind 获取输出。想一想,以下是否有意义:“DisplayPics 是一个 PicFind。”?如果不是,则可能是错误的。
  2. 类通常不是动词。更好的名称是 Pictures,包含 finddisplay 方法.在你的例子中,你在一个目录中找到了一些东西,这导致了下一点:
  3. 您应该使用 PHP DirectoryIterator类。 这样,您可以对找到的文件做任何您想做的事情。您将拥有有关可用文件的所有信息,并且它与 PHP 完美集成。
  4. 您需要关注点分离。这就是 hakre 建议的全部内容。减少依赖和解耦通常是有帮助的。

/**
* ExtensionFinder will find all the files in a directory that have the given
* extensions.
*/
class ExtensionFinder extends DirectoryIterator {

protected $extensions = array();

public function __contruct($directory) {
parent::__construct($directory);

}

/**
* Sets the extensions for the iterator.
* @param array $extensions The extensions you want to get (without the dot).
*/
public function extensions(array $extensions) {
$this->extensions = $extensions;
}

/**
* Determines if this resource is valid. If you return false from this
* function, the iterator will stop.
* @return boolean Returns true if the value is a file with proper extension.
*/
public function valid() {
if (parent::valid()) {
$current = parent::current();

if ($current->isFile()) {
// if the extensions array is empty or null, we simply accept it.
if (empty($this->extensions)) {
//otherwise filter it
if (in_array($current->getExtension(), $this->extensions)) {
return true;
} else {
parent::next();
return $this->valid();
}
} else {
return true;
}
} else {
parent::next();
return $this->valid();
}
} else {
return false;
}

}
}

class PictureFinder extends ExtensionFinder {
public function __construct($directory) {
parent::__construct($directory);

$this->extensions = array (
'jpg',
'gif',
'png'
);
}
}

使用方法:

$iterator = new PictureFinder('img/');
foreach($iterator as $file) {
//do whatever you want with the picture here.
echo $file->getPathname()."\n";
}

请注意,您可以使用我在上面定义的 ExtensionFinder 类来查找任何扩展名的文件。这可能比简单地查找图像更有用,但我为该特定用例定义了一个 PictureFinder 类。

关于PHP实例化子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8172726/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com