PHP создание экземпляра дочернего класса - PullRequest
4 голосов
/ 17 ноября 2011

Я пытаюсь стать здесь объектно-ориентированным кодером, поэтому я ставлю перед собой несколько простых задач.
Я создал класс, который отображает все изображения в данном каталоге.Это работало нормально, поэтому я разделил этот класс на два класса, один для чтения имен файлов в каталоге и передачи их в массив, а другой для анализа этого массива и отображения изображений.Метод в дочернем классе точно такой же, каким он был в родительском классе (за исключением, конечно, замены parent :: for 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/');

Ответы [ 4 ]

5 голосов
/ 17 ноября 2011

Если честно: весь ваш дизайн неправильный.

  1. DisplayPics не должно наследоваться от Picfind. Честно говоря, либо Picfind имеет метод отображения, либо DisplayPics принимает вывод из Picfind. Подумайте, имеет ли смысл следующее: «DisplayPics - это PicFind»? Если нет, то это, вероятно, неправильно.
  2. Классы обычно не являются глаголами. Лучшее имя будет Pictures с методами find и display. В вашем случае вы находите что-то в каталоге, что приводит к следующему пункту:
  3. Вы должны использовать класс PHP DirectoryIterator. Таким образом, вы можете делать все, что захотите, с найденными файлами. У вас будет вся информация о файле, доступном для вас, и он прекрасно интегрирован с PHP.
  4. Вам нужно разделить проблемы. В этом и заключается суть предложения Хакре. Сокращение зависимостей и разъединение вещей обычно полезно.

/**
 * 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 (isset($this->extensions) && count($this->extensions)>0) {
                    //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 для этого конкретного варианта использования.

2 голосов
/ 17 ноября 2011

Вы написали, что хотите изучать объектно-ориентированное программирование.Как насчет следующего:

class PicFinder
{
   /**
    * @return array
    */
   public function inDirectory($directory)
   {
       return // array of files
   }
}

class PicPresentation
{
    public function present(array $pictures)
    {
        // your presentation code
    }
}


$path = '/your/path';
$datasource = new PicFinder();
$presentation = new PicPresentation();
$pictures = $datasource->inDirectory($path);
$presentation->present($pictures);

Держите вещи отделенными и слабо связанными.Один объект должен отвечать за одну вещь, например, один объект для получения списка изображений из каталога, а другой - для презентации.Удачи!

0 голосов
/ 17 ноября 2011

Я бы предложил этот дизайн вместо:

class PicFinder
{
    public function findPics($dir){
       ...
    }
}

class PicDisplayer
{
    protected $picFinder;

    public function __construct() {
        // Default pic finder
        $this->setPicFinder(new PicFinder());
    }

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

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

    protected function setPicFinder(PicFinder $picFinder) {
        $this->picFinder = $picFinder;
    }
    protected function getPicFinder() {
        return $this->picFinder;
    }
}

Таким образом, вы используете только PicDisplayer, и вам все равно, как он находит фотографии. Но вы все равно можете изменить «PicFinder», если это необходимо, расширив класс PicFinder и реализовав определенное поведение.

0 голосов
/ 17 ноября 2011

$ Myclass-> displayPics ( './ изображений /');вызывает конструктор и ничего не происходитУ вас также есть опечатка в названии вашей функции.

...