@phpcoder81

Правильно ли я создал класс?

Парни, я создал первый в жизни класс. Точнее два (страница и товар).
Я пока учусь. Посмотрите пожалуйста, есть ли ГРУБЫЕ ошибки в грамматике кода. И вообще это ООП стиль или пока еще процедурный?

<?php

class myPage
{
	private $h1;
	private $content;
	private $css = array();
	private $js = array();
	
	public function set_h1($text)
	{
		$this->h1 = '<h1>'.$text.'</h1>';
	}
	
	public function append_Content($content)
	{
		$this->content .= $content;
	}
	
	public function insert_Css($res)
	{
		$this->css[] = $res;
	}	
	
	private function css_files2html($arr)
	{
		if(!is_array($arr) || count($arr) == 0)
		{
			return;
		}
		
		static $code;
		
		foreach($arr as $v)
		{
			$code .= '<link href="'.$v.'" type="text/css" rel="stylesheet" />';
		}
		
		return $code;
	}
	
	public function createPage()
	{
		$repl = array(
			'{content}' => $this->h1.'<div class="content">'.$this->content.'</div>',
			'{links}' => $this->css_files2html($this->css)
		);
		
		return strtr(file_get_contents('theme/template.html'), $repl);	
	}
}



class myProduct
{
	private $id;
	private $name;
	private $price;

	public function __construct($id, $name, $price)
	{
		$this->id = $id;
		$this->name = $name;
		$this->price = $price;
	}
	
	public function __destruct()
	{

	}
	
	public function product_Create()
	{
		static $code;
		
		$code = '<div class="product-item-'.$this->id.'">';
		$code .= '<h3>'.$this->name.'</h3>';
		$code .= '<p>Цена: '.$this->price.' руб.</p>';
		$code .= '</div>';
		
		return $code;
	}
}


/************* CODE *************/


$page = new myPage();

echo $page->insert_Css('/theme/main.css');
echo $page->insert_Css('/theme/print.css');


$url = 'about/'; //temp

$result = $mysqli->query("SELECT * FROM `pages` WHERE `url` = '".$url."'");
if($result->num_rows == 1)
{
	$row = $result->fetch_assoc();
	
	$page->set_h1($row['h1']); //set h1
	$page->append_Content($row['text']); //append text of page
}
else
{
	$page->set_h1('404 Page not found');
}

$result->close();


//random append content for page
$page->append_Content(file_get_contents('theme/promo_block.html'));


//Вывод будет потом из БД.
$temp_pro = array(
 1 => array('name' => 'Товар1', 'price' => '1000'),
 2 => array('name' => 'Товар2', 'price' => '4000'),
 3 => array('name' => 'Товар3', 'price' => '2000')
);


$product_obj = '';

foreach($temp_pro as $key => $val)
{
	$product_obj = new myProduct($key, $val['name'], $val['price']); //create product

	$page->append_Content( $product_obj->product_Create() ); // append product
}

echo $page->createPage(); //output page


Меня особенно волнует правильно ли я наполняю переменные для return-на. Не люблю кгда return много строчный. В классе я так понял это статичная переменная лучше подходит.
  • Вопрос задан
  • 630 просмотров
Решения вопроса 2
@IceJOKER
Web/Android developer
Бегло посмотрел код и что бросилось в глаза - это названия методов, пишите в стиле camelCase, а не almost_Camel_Case

insertCSS (можно и Css как вам удобнее)
appendContent
etc.

Меня особенно волнует правильно ли я наполняю переменные для return-на - лучше минимизировать return , чтоб он возвращал какой-нибудь примитивный тип(boolean, array, int etc.), но не HTML текст(прочтите про MVC).

И зачем префиксы my*? без не лучше?
set_h1- это не айс, а что если потом захотите h1 поменять на div#title? абстрагируйтесь, пишите setTitle или как-то по другому.

В остальном - учитесь и практикуйтесь, смотрите код на github и сравнивайте, а то ваш вопрос какой-то некорректный что ли
Ответ написан
@Serdonda
В целом это все еще некая продвинутая "лапша", тоесть код в перемешку с выводом и обращением к базе и вкраплениями ооп.

Попробуйте почитать www.php-fig.org/psr/psr-1 - это общепринятые стандарты, в частности там рекомендуется не смешивать в одном файле обьявления функций/классов, их применения, подгрузку и вывод данных. Там же даны рекомендации об именовании (тот же кемелкейс и т.д.)

Для примера можно посмотреть как другие учились. Вот неплохой образец на который я как то наткнулся https://bitbucket.org/e_svirsky/webshop/src/1e8de2...
это как бы обучающее задание, но пройдясь по нему возможно станет понятнее.

Потом можно посмотреть какое нибудь простое приложение, например вот недавно натолкнулся и рассматривал такой вариант https://github.com/semaster/2FAuth-Steganography - на этом примере будет понятней как использовать mvc, обьекты, автозагрузку
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Стиль кода жо.. плохой кароче. В принципе выше уже написали, я немного повторюсь по пунктам.
- Пишите camelCase стилем - это модно и красиво :) (а так же рекомендуется стандартами psr-1, что гораздо важнее).
- Фигурные скобки ставьте по psr-1 - код становится опрятнее.
- Не жалейте букв - пишите длинные понятные наименования методов и свойств.
- В объектах модели не нужно(читай нельзя) использовать куски представления(читай html и иже с ним). Модель(в данном случае товар - модель) хранит и обрабатывает чистые данные, отображение - не ее задача.
- Получение данных кодом и передача в объект - ваще кошмар. Объект сам должен знать как инициализировать себя, ему достаточно передать данные для инициализации(например уникальный id), запрос в базу в идеале должен происходить в отдельном объекте(например bd), который вызывается из модели, результат возвращаться в объект модели. Этими данными модель и инициализируется.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы