Разработка ООП приложения на PHP.Как? - PullRequest
0 голосов
/ 04 января 2011

Я новичок в PHP ООП. Я пытаюсь понять, как я могу структурировать такое приложение. Это приложение для чистки около 100 различных веб-сайтов.

У меня есть основной класс "Scrap", который обрабатывает методы, которые являются глобальными для всех различных веб-сайтов, а внутри папки "Scripts" у меня есть классы для обработки определенных аспектов веб-сайта, который я очищаю. У меня есть другая папка, которая называется «Lib» для включения внешних библиотек.

Позвольте мне объяснить визуально:

У меня есть эта схема файла:

- Scrap.php
+ Scripts
               - Google.php
               - Yahoo.php
               - Stackoverflow.php
+ Lib
     + libScrap
               - LIB_parse.php
     + phpQuery
               - phpQuery.php
               - others files and folder...

Scrap.php содержит следующее:

<?php

// Includes
require('/lib/libScrap/LIB_parse.php');
require('/lib/phpQuery/phpQuery.php');

// Testing Scrap
$testing = new Scrap;
$testing->teste = $testing->getPage('http://www.yahoo.com','','off');
echo $testing->teste; 


class Scrap {

    public function __construct() {
        // do things!
    }

    /*
    * This method grabs the entire page(HTML) on given URL
    * Ex: $htmlgrab->teste = $htmlgrab->getPage('http://testing.com/ofertas/','','off');
    * Returns, the HTML of given URL
    */
    public function getPage($site, $proxy, $proxystatus) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        if ($proxystatus == 'on') {
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
            curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, TRUE);
            curl_setopt($ch, CURLOPT_PROXY, $proxy);
        }
        curl_setopt($ch, CURLOPT_COOKIEFILE, "cookie.txt");
        curl_setopt($ch, CURLOPT_URL, $site);
        ob_start();      // prevent any output
        return curl_exec ($ch); // execute the curl command
        ob_end_clean();  // stop preventing output
        curl_close ($ch);
    }

    /*
    * 
    * 
    */
    public function getLinks() {
        // do things!
    }

    /*
    * This method grabs the page title.
    * Ex: <title>This is the page title</title>
    * Returns, "This is the page title"
    */
    public function getTitle() {
        // do things!
    }

}
?>

А внутри папки «Скрипты» у меня будут такие файлы:

<?php
require('../Scrap.php');

class Yahoo extends Scrap {

    public function doSomething() {
        // do things!
    }

}
?>

Конечное примечание: мне нужно вызвать / создать все классы, созданные в папке «Сценарии», чтобы очистить сайты. Я сомневаюсь в том, что лучший способ создать около 100 классов.

Если вы можете дать мне несколько подсказок о том, как спроектировать это.

С наилучшими пожеланиями,

Извините, мой плохой английский.

Ответы [ 4 ]

0 голосов
/ 04 января 2011

Шаблоны, которые вы, вероятно, ищете: Стратегия или Команда .

Что касается настройки скребков, у вас есть различные варианты.Вы можете жестко закодировать путь к скребкам в основной класс Scrape, либо загрузить их из файла конфигурации, либо использовать автозагрузку, либо карту классов, либо использовать Factory или их комбинацию.Это действительно зависит от вас.Гораздо важнее решить, что хорошо работает с вашим приложением.

Если вы уже используете автозагрузку, убедитесь, что ваши скребки найдены.Если вы хотите добавить дополнительный автозагрузчик, сделайте это.Если вы предпочитаете карту классов для дополнительной безопасности и скорости, используйте карту классов и так далее.Обсуждение всех плюсов и минусов выходит за рамки этого вопроса.Если вы заинтересованы в этом, посмотрите этот пост в блоге об автозагрузке тестов (это для ZF2, но обычно применимо).

Поскольку ни один из соскобов, вероятно, не зависит друг от друга,Я предлагаю рассмотреть что-то вроде Gearman , чтобы выполнять их асинхронно в разных процессах, а не последовательно в одном и том же сценарии.В этом случае ваш основной сценарий будет только создавать необходимых рабочих с соответствующими настройками и запускать их в фоновом режиме.В руководстве есть несколько примеров, а вот еще один с того же сайта, что и статья для сравнения

0 голосов
/ 04 января 2011

Предполагая, что у каждого класса есть собственный исходный файл, вы можете рассмотреть ' автозагрузка '.В моих собственных проектах я использую функцию spl_autoload_register () для достижения этой цели вместо использования __autoload ().

0 голосов
/ 04 января 2011

Я бы посоветовал вам назвать ваши классы Scrap следующим образом:

Scrap_Yahoo
Scrap_Google
...

Затем вы делаете то, что предлагал Dutchie432:

$scraps = array();
foreach (glob('scripts/*.php') as $script) {
  $scrap = 'Scrap_' . pathinfo($script, PATHINFO_FILENAME);
  require_once($script);
  $scraps[] = new $scrap();
} 

Затем вы можете делать все что угодно с этим массивом/ factory of scraps:

foreach ($scraps as $scrap) {
  $scrap->scrap();
}

Затем вы должны определить абстрактный метод scrap() в своем классе Scrap, и не забудьте сделать класс абстрактным:

// file: Scrap.php
abstract class Scrap {
  public abstract scrap();
}

Everyкласс в каталоге scripts/* расширит класс Scrap и определит только этот конкретный метод scrap().

Вы можете пойти еще дальше и внедрить Шаблонный метод Шаблон проектирования.

0 голосов
/ 04 января 2011

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

$arr = glob ('scripts/*.php');
foreach ($arr as $script)
    include_once ($script);

UPDATE

Что касается инициализации каждого объекта ... лучше всего было бы объявить объект внутри каждого класса ... вот так ...

<?php
require('../Scrap.php');

class Yahoo extends Scrap {

    public function doSomething() {
        // do things!
    }
}

$yahooObj = new Yahoo(); //This is the addition

?>

Таким образом, после вызова include_once('yahoo.php') вы также получите объект $yahooObj.

Я копаю?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...