在现有PHP中加入OOP

时间:2012-06-08 00:18:35

标签: php oop encapsulation

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

给定一个类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中的代码,构造函数将期望值分配给$count$data。在Java和C中,变量不需要在声明时进行实例化。对PHP来说这是真的吗?

2 个答案:

答案 0 :(得分:4)

在您的构造函数中,您必须使用$this->count代替$count$dirArray使用{{1}}。

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

答案 1 :(得分: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成员不是“可见的”,所以当你扩展类时。

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

如果您想学习如何在PHP环境中使用OOP,请先阅读http://php.net/manual/en/language.oop5.php。你可能会发现PHP Object-Oriented Solutions本书对你有很大的帮助。