2015-10-04 3 views
1

В настоящее время я создаю класс для обработки каталога/файла для проекта, над которым я работаю. Чтобы сделать его более гибким, я хотел бы найти способ сделать динамический оператор if для обработки исключений. Я вижу, что это полезно и в других местах. Я хотел бы сделать это так IF($file !=.... были некоторые вещи, какDynamic PHP If заявление для фильтрации результатов

PUBLIC $filter = '$file != "."....'; 

IF($filter) 

Так что я мог бы установить в основной программе $filter непосредственно перед вызовом FileLib1\GetDirectory() в настоящее время я следующий внутри из GetDirectory()

while ($file = readdir($handler)) 
{ 

    // if file isn't this directory or its parent, add it to the results 
    //If $file != statement excludes things we dont want in the listing. 
    if ($file != "." && $file != ".." && $file !="0grp" && $file !="0ren" && $file != "unz.sh" && $file != "index.php" && $file != "galery.php" && $file != "forward.jpeg" && $file != "helper.html" && $file != "image.php" && $file != "reverse.jpeg") 
    { 
     $results[] = $file; 
    } 

} 

Я обновляю вопрос с помощью нескольких бит, которые мне пришлось изучить на этом пути, чтобы более точно ответить на этот вопрос.

$exclusions = new CustomHandler(); 
$exclusions->exclude(array(
    'cover.jpg', 
)); 
$fileExclusions = $exclusions->getExclusions(); 

Это, как я должен был форматировать код для выполнения класса для работы.

public function getExclusions() 
{ 
    return $this->excludes; 
} 

Это было добавлено в конце класса, чтобы обеспечить возвращение значения из класса переменной среды выполнения для использования в случае утверждения, как ..

if(!in_array($content, $fileExclusions)){ ... } 
+0

Оба ответы ниже правильно, я выбрал тот, который был более класс ориентированный как правильный ответ , – Kendrick

ответ

1

Ну, если вы строите класс, вы можете установить переменную по умолчанию, такую ​​как $excluded, которая представляет собой пустой массив. Тогда в конструктор класса можно инициализировать значения по умолчанию и объединять любые пользовательские те прошли в, как:

$handler = new CustomHandler(array('screen.jpg', 'stuff.png', 'script.sh')); 

такой реализации будет выглядеть следующим образом:

class CustomHandler { 

    /* 
    * Empty variable. Used to reference excluded variables during invoking and processing. 
    */ 

    public $excluded = array(); 

    /* 
    * @param $excludes - array 
    * 
    */ 
    public function __construct($excludes = false) 
    { 
     //default exclusions here. 
     $this->excludes = array(
      '0ren', 
      'unz.sh' 
      //etc.... 
     ); 
     if(is_array($excludes)){ 
      $this->excludes = array_merge($this->excludes, $excludes); 
     } 
    } 

    //other functions to process here 
} 

Кроме того, я просто понял, что если вы хотите использовать цепочку методов, чтобы сохранить накладные расходы на конструкторе. Этот пример приведен ниже.

class CustomHandler { 

    /* 
    * Empty variable. Used to reference excluded variables during invoking and processing. 
    */ 

    public $excluded = array(); 

    public function __construct() 
    { 
     return $this;   
    } 

    /* 
    * @param $excludes - array 
    */ 
    public function exclude($excludes = false){ 
     //default exclusions here. 
     $this->excludes = array(
      '0ren', 
      'unz.sh' 
      //etc.... 
     ); 
     if(is_array($excludes)){ 
      $this->excludes = array_merge($this->excludes, $excludes); 
     } 
     return $this; 
    } 

    public function process(){ 
     echo 'Pre-process handler..'; 
     echo '<pre>', print_r($this->excludes, true),'</pre>'; 
    } 
} 

$handler = new CustomHandler(); 

$handler->exclude(array(
    'screen.jpg', 
    'stuff.png', 
    'script.sh' 
))->process(); 

And finally..here's a working example

+0

последний "$ this-> исключает = array_merge ($ this-> исключает, $ исключает);" меня сбивает с толку. Я новичок в классах, поэтому я, возможно, не понимаю этого правильно, но, похоже, он запускается после факта, а не для обновления исключений. – Kendrick

+0

В первом примере шаблон исключения выполняется до того, как всякая логика выполняется в классе. В моем втором примере я допускаю, чтобы функция exclude запускалась независимо, но метод-цепочка, так что вы можете иметь ее в любом случае.Наконец, '$ excludes' передается как последний аргумент, так что он может обновлять любые предыдущие ключи, если они существуют и сопоставляются (поэтому ваши значения по умолчанию не могут быть перезаписаны) – Ohgodwhy

+0

У меня возникают проблемы с переносом головы вокруг этого , Взяв второй пример, часть процесса сбивает с толку. Я могу использовать это, чтобы сделать $ handler массив, а затем использовать if (in_array ($ file, $ handler)), я думаю. – Kendrick

1

Вы можете использовать подход, подобный этому -

$notArray = array('.', '..', '0grp', '0ren','unz.sh','index.php','galery.php','forward.jpeg','helper.html','image.php','reverse.jpeg'); 
if (in_array($file, $notArray)) { 
    echo 'skipping '; 
} 
echo $file.PHP_EOL; 

Однако, я предлагаю вам реорганизовать ваши файлы, так что файлы интереса находятся в одном каталоге.

Или используйте Glob запрашивать только те файлы, имена которых соответствуют заданному шаблону, например:

$dataFiles = glob("*.dat"); 
+0

Это часть того, что это делает. Я никогда не хочу. или .. и в моем проекте я импортирую данные из другой системы в мою, поэтому мне приходится работать над тем, как все было сделано в этом проекте. Я надеялся использовать это, чтобы замаскировать статический контент или другие нежелательные элементы. Я не могу отключить текущую систему в автономном режиме, чтобы изменить ситуацию, поэтому динамика, если бы облегчила жизнь. – Kendrick

+0

Затем используйте ** glob **, чтобы выбрать только те файлы, которые вас интересуют. – user2182349

+0

Принял меня немного, чтобы разобраться, но это хороший способ сделать это. вам нужно будет проверить и посмотреть, будет ли (! in_array ($ file, $ notArray)) работать, если это будет быстрый способ справиться с этим. Другой ответ, похоже, имеет более гибкую конструкцию и, кажется, лучший ответ, но оба хороши – Kendrick

Смежные вопросы