0

開発中の Web アプリに 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;
  }

}

ここでの情報を使用して、Web ページのレンダリングに使用したいと考えています。指定された div 要素内で、私は持っています

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

ただし、$count$dataはローカルでインスタンス化されず、含まれている情報をレンダリング コードで使用することはできません。xdebug でコードをステップ実行すると、コンストラクターが期待値を$countおよびに割り当てます$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代わりに使用することをお勧めします。クラスのメンバーが「見えない」ため、クラスを拡張すると。privateprivateprivate

もう 1 つは、実際に必要なときに、オブジェクトの初期化をある位置に移動することです。わずかな変更を加えると、このクラスを使用してフォルダを繰り返し検索したり、別のフォルダをまとめて検索したりできます。

PHP のコンテキストで OOP を利用する方法を学びたい場合は、まずhttp://php.net/manual/en/language.oop5.phpを読んでください。また、 PHP オブジェクト指向ソリューションの本が大きな助けになるかもしれません。

于 2012-06-11T16:26:35.867 に答える