Является ли классы PHP эффективным решением для размещения контента? - PullRequest
0 голосов
/ 05 августа 2010

Я хотел бы разместить мое портфолио на нашем веб-сайте, и я написал класс «Клиент» для установки и получения параметров об основах каждого клиента, а именно: имя клиента, веб-сайт, есть ли он, опубликованы ли, какие элементы были сделанымы делаем для них и т. д.

Это довольно примитивно, но я прав, предполагая, что лучше создать объект для каждого клиента (и хранить данные каждого вместе), а не создавать массивы для каждого параметра и вызывать соответствующие элементыкаждый раз из этих массивов?

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

<?php

class Client {
    private $name = "";
    private $items = array();
    private $website = "";
    private $featured = false;
    private $published = false;
    private $type = array();
    private $filename = null;
    private $extension = null;

    public function __set($name, $value) {
        //echo "Setting ".$name." to value: ".$value."\n";
        $this->{$name} = $value;
    }

    public function __get($name) {
        //echo "Getting ".$name.": ".$this->{$name};
        return $this->{$name};
    }

    public function __isset($name) {
        return isset($this->{$name});
    }

    public function __unset($name) {
        unset($this->{$name});
    }
}

?>

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

Вот мой другой код, который я использую длясоздайте каждый объект Client:

<?php

// create Client object for every client

$files = array();
// files to take out of file listing, I'm developing on Mac, i.e. ._DS_Store file
$bad_files = array(".","..","._DS_Store");
$portfolio = "portfolio";
$images = "images";
$details = "details";
$thumbs = "thumbs";

// get all *.txt files listed in portfolio, so a client will not be added to portfolio without the necessary details.
if (is_dir("$images/$portfolio")) {
    if (is_dir("$images/$portfolio/$details")) {
        $files = scandir("$images/$portfolio/$details");

        sort($files);
    }
}
$files = array_diff($files, $bad_files);
sort($files);

// keeps a list of all clients
$clients = array();

foreach ($files as $file) {
    $value = file_get_contents("$images/$portfolio/$details/$file");

    $newClient =  new Client();

    $filename = explode(".",$file);
    $newClient->filename = $filename[0];
    $client_image = glob("$images/$portfolio/$images/".$newClient->filename.".*");
    $newClient->image = $client_image[0];
    $client_thumb = glob("$images/$portfolio/$thumbs/".$newClient->filename.".*");
    $newClient->thumb = $client_thumb[0];

    $client_items = array();
    $client_type = array();

    // gets variables from text file contents and explode string to array [key=value] values
    $content = explode("&",$value);
    for ($j=0; $j<count($content); $j++) {
        $client = explode("=", $content[$j]);
        if (strpos($client[0],"name") !== false) $newClient->name = $client[1];
        if (strpos($client[0],"items") !== false) $client_items = $client[1];
        if (strpos($client[0],"website") !== false) $newClient->website = $client[1];
        if (strpos($client[0],"featured") !== false) $newClient->featured = $client[1]; // show on frontpage
        if (strpos($client[0],"published") !== false) $newClient->published = $client[1]; // show at all
        if (strpos($client[0],"type1") !== false) $client_type[] = $client[1]; // show for specific type, eg. business card, website
        if (strpos($client[0],"type2") !== false) $client_type[] = $client[1]; // show for specific type, eg. business card, website
    }

    // these parameters need array type values
    $newClient->type = $client_type;
    $newClient->items = explode(", ",$client_items);

    // adds client to list of clients
    $clients[] = $newClient;
}

?>

Вот код, который я использую для вывода баннера каждого клиента, и сведения:

<div id="banner_content">
    <?
        foreach ($clients as $client) {
        // client must be published to show at all
            if ((($page == "home" && $client->featured) || $page != "home") && $client->published) {
    ?>
    <div class="banner_container"><img src="<? echo $client->image; ?>" width="809" height="324" alt="<? echo $client_name; ?>" title="<? echo $client_name; ?>" />
        <div class="banner_details">
            <div class="client_name">Client: <b><? echo (!empty($client->name) ? $client->name : "Unknown"); ?></b></div>
            <div class="client_items"><? echo (!empty($client->items) ? "Items: <b>".join(", ",$client->items)."</b>" : ""); ?></div>
            <div class="client_website"><? echo (!empty($client->website) ? "Website: <b><a href=\"http://".strtolower($client->website)."\">".$client->website."</a></b>" : ""); ?></div>
        </div>
    </div>
    <?
    }
}
?>
</div>

Любая помощь или совет будет высоко ценится.Заранее спасибо.

// edit

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

Ответы [ 2 ]

0 голосов
/ 05 августа 2010

Если класс является эффективным решением, зависит от того, как вы его реализуете.Не похоже, что ваш код будет магически улучшен, потому что вы добавляете объявление класса к чему-либо.

Одна из ключевых идей использования классов заключается в инкапсуляции состояния и ответственности.Таким образом, наличие класса Client, который инкапсулирует состояние клиента, является хорошей идеей.Предоставление ему методов для визуализации себя как List или Table не является.Я знаю, что вы этого не делаете, но вы также не используете класс, который отвечает за отображение клиента в списке или таблице.Также у вас нет классов для поиска связанных файлов клиента.Ваш второй опубликованный кодовый блок является процедурным сценарием.Он не использует ООП.Определите проблемы и разбейте их на небольшие (проверяемые) блоки.Объедините их в соответствующие классы.

Есть замечательная серия статей Лорны Джейн Митчелл о PHP5 и OOP , а также множество хороших вопросов и ответов о StackOverflow .Вы также хотите взглянуть на что такое шаблоны проектирования .А вот вот бесстыдная самоподключаемая .

0 голосов
/ 05 августа 2010

У меня нет никакого опыта в веб-разработке, но использование класса здесь определенно лучше практики программирования.Управление несколькими параллельными массивами проблематично.Например, всякий раз, когда вы вставляете новый элемент или вам нужно переместить элементы, вы должны помнить каждый массив.Кроме того, использование здесь класса делает ваш код более организованным и, следовательно, более легким в обслуживании.Я думаю, что реализация классов, безусловно, стоит того, особенно если вы освоили использование классов в PHP!

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