0

我正在尝试将 OOP 原则与我正在开发的网络应用程序结合起来。

给定一个类 ImageData 定义为

class ImageData {
  private $count;
  private $dirArray;

  public function __construct() {
    $count = 0;    
    $dir = "panos/thumbs";
    $dirCon = opendir($dir);

    while ($name = readdir($dirCon)){
      if (strtolower(substr($name, -3)) == "jpg"){
        $dirArray[]= $name;
      }
    }

    sort($dirArray);
    $count= count($dirArray);

    closedir($dirCon);
  }

  public function getCount(){
    return $this->count;
  }

  public function getArray(){
    return $this->dirArray;
  }

}

我想使用此处的信息来呈现网页。在指定的 div 元素中,我有

$imageData = new ImageData();
$count = $imageData->getCount();
$data = $imageData->getArray();

但是,$count$data没有在本地实例化,并且包含的​​信息不可在渲染代码中使用。我已经逐步完成了 xdebug 中的代码,并且构造函数将预期值分配给$countand $data。在 Java 和 C 中,不需要在声明时实例化变量。这对 PHP 来说是真的吗?

4

2 回答 2

4

在您的构造函数中,您必须使用$this->count代替$count, 相同的$dirArray.

PS:你可以在 PHP 类中只声明你的变量。

于 2012-06-08T00:23:44.447 回答
1

免责声明:由于显然已经回答了问题,因此这是对所提供代码的长格式评论。

编写类时,应尽量避免在构造函数中进行计算。它使调试代码变得困难。

我实际上会像这样构造代码:

class ImageData {
    protected $count = 0;
    protected $dir = null; 
    protected $dirArray = null; 

    public function __construct( $dir = 'panos/thumbs') {
        $this->dir = $dir;   
    }

    public function getCount(){

       if ( is_array($this->dirArray) ){
           $this->initialize();
       }

       return $this->count;
    }

    public function getArray(){

       if ( is_array($this->dirArray) ){
           $this->initialize();
       }

       return $this->dirArray;
    }

    protected function initialize(){

       $this->dirArray = $this->findImages();

       sort($this->dirArray);
       $this->count = count($dirArray);

    }

    protected function findImages( $extensions = array('jpg') ){

       $files = array();
       $dirCon = opendir($this->dir);

       while ($name = readdir($dirCon)){
           $current = strtolower(substr($foo, strrpos($foo, '.')+1));
           if ( in_array( $current, $extensions ) ){
               $files[] = $name;
           }
       }

       closedir($dirCon);
       return $files
    }

}

首先,我建议您使用protected而不是private,如果您现在不使用它们,那么您实际上需要它们private。因为private类的成员不是“可见的”,所以当你扩展类时。

另一件事是将对象的初始化移动到实际需要的位置。稍加修改,这个类就可以让你重复搜索文件夹,甚至可以在不同的文件夹中搜索。

If you want to learn how to utilize OOP in context of PHP, start by reading http://php.net/manual/en/language.oop5.php . And you might find PHP Object-Oriented Solutions book to be a big help.

于 2012-06-11T16:26:35.867 回答