Autor Zpráva
leedsU
Profil *
Ahoj, prosím o názor,

1) vypisování echo nebo print se má provádět ve scriptu vlastní třídy (v metodě public function neco {
$this->prom = 'Ahoj';
echo $this->prom;
}) nebo ve scriptu, který si třídu podle potřeby volá?

$g = new Novatrida;
echo $g->neco;

2) musí být vždy u třídy definován __construct?
Měsíček
Profil
1.) Je to na tobě.
2.) Nemusí.
leedsU
Profil *
Díky, zatím mi přijde, že všechno co dělám v oop jde udělat i funkcemi :)
Mastodont
Profil
Dá, ale někdy je to komplikovanější, hlavně u dědičnosti.
leedsU
Profil *
Řekněme, že se teď v rámci nauky OOP PHP snažím napsat třídu pro vytvoření základního html rozhraní, zatím mi to přijde jako tvoření šablony:
<?php
class Html_page {

	private $html;
	private $keywords;
	private $description;
	private $robots;
	private $charset;
	private $title;
	private $css;
	private $js;
	private $layout;
	private $lang = array(1=>'english', 'czech', 'germany', 'denmark', 'espanol', 'finland', 'france', 'greece', 'hungary', 'israel', 'italy', 'japan', 'korea', 'holland', 'norway', 'poland', 'portugal', 'russia', 'sweden');
	private $language;


	const AUTHOR = "www@gmail.com";
	const CASE_CONTROL = "no-cache";
	const PRAGMA = "no-cache";
	const EXPIRES = "-1";
	const CHARSET = "text/html; charset=utf-8";

	public function __construct () {
		// nastavení jazyka stránky
		if(isset($_COOKIE['l']) && !isset($_GET['l'])) {

			if(in_array($_COOKIE['l'], $this->lang))
			{
				$this->language = $_COOKIE['l'];
			}
			else {
				$this->language = 'english';
				setcookie('l', 'english', time()+180*24*60*60);
			}
		}
		if (!isset($_COOKIE['l']) && !isset($_GET['l'])) {
			$this->language = 'english';
			setcookie('l', 'english', time()+180*24*60*60);
		}

		if(isset($_GET['l'])) {
			session_destroy();
			/*if(!in_array($_GET['l'], $this->lang)) {
			 $this->language = 'english';
			 setcookie('l', 'english', time()+180*24*60*60);
			 }
			 else {
			 $this->language = $_GET['l'];
			 setcookie('l', $_GET['l'], time()+180*24*60*60);
			 } */

			$this->language = 'english';
			setcookie('l', 'english', time()+180*24*60*60);

		}
	}

	function keyws($keyw) {
		if(isset($keyw)) {
			$this->keywords = $keyw;
		}

	}

	function descr($descr) {
		if(isset($descr)) {
			$this->description = $descr;
		}

	}
	function robot($robot) {
		if(isset($robot)) {
			$this->robots = $robot;
		}

	}
	function title($title) {
		if(isset($title)) {
			$this->title = $title;
		}

	}

	public function html_start() {

		$this->html = '<?xml version="1.0"?>'."\n";
		$this->html .= '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">'."\n";
		$this->html .= '<head>'."\n";
		$this->html .= '<meta name="keywords" content="'.$this->keywords.'" />'."\n";
		$this->html .= '<meta name="description" content="'.$this->description.'" />'."\n";
		$this->html .= '<meta name="author" content="'.self::AUTHOR.'" />'."\n";
		$this->html .= '<meta name="robots" content="'.$this->robots.'" />'."\n";
		$this->html .= '<meta http-equiv="Cache-Control" content="'.self::CASE_CONTROL.'" />'."\n";
		$this->html .= '<meta http-equiv="Pragma" content="'.self::CASE_CONTROL.'" />'."\n";
		$this->html .= '<meta http-equiv="Expires" content="'.self::PRAGMA.'" />'."\n";
		$this->html .= '<meta http-equiv="Content-Type" content="'.self::CHARSET.'" />'."\n";
		$this->html .= '<link href=".'.dirname($_SERVER['PHP_SELF']).'/css/style.css" rel="stylesheet" type="text/css" />'."\n";
		$this->html .= '<script src=".'.dirname($_SERVER['PHP_SELF']).'/js/script.js" type="text/javascript"></script>'."\n";
		$this->html .= '<title>'.$this->title.'</title>'."\n";
		$this->html .= '</head>'."\n";
		$this->html .= '<body>'."\n";
		
		echo $this->html;
	}

	public function html_end() {
		$this->html = '</body>'."\n";
		$this->html .= '</html>'."\n";
		
		echo $this->html;
	}


}
?>


Je funkce html_start() napsaná dobře? Zdá se mi, že by tam nemuselo být pokaždé $this->html .= ale stačilo by echo.

Tak mám jednoduchou stránku, ale to přeci člo napsat ve funkcích procedurálně, proč to psát takhle s ohledem do budoucna, jak bych mohl dál využít dědičnosti?
leedsU
Profil *
ještě volání:

<?php
require_once 'html_page.php';
require_once '../class/scripts.php';

$html = new Html_page();
$html->descr(utf8String('Strána s testovacím rozhraním třídy Html_page'));
$html->keyws(utf8String('Stránka, test, rozhraní'));
$html->robot('All');
$html->title(utf8String('Vítejte na úvodní stránce'));

$html->html_start();

$html->html_end();
?>
Timy
Profil
leedsU
ad 1)
Třída se má starat buď o zpracovávání informací nebo o jejich výpis. Slučovat to do jedné třídy není pěkné, asi jako míchat sémantické a formátovací prvky v HTML.
Mastodont
Profil
leedsU
Tohle je krásný příklad toho, jak by se objekty používat neměly - je to IMHO mnohem pomalejší než načíst šablonu a vyplivnout dopředu načtené bloky a HEAD do jejího obsahu.
leedsU
Profil *
leedsU
ad 1)
Třída se má starat buď o zpracovávání informací nebo o jejich výpis. Slučovat to do jedné třídy není pěkné, asi jako míchat sémantické a formátovací prvky v HTML.


Myslíš předpokládám toto:
public function neco {
$this->prom = 'Ahoj';
echo $this->prom;
} 


správně tedy jen:

public function neco {
$this->prom = 'Ahoj';
return $this->prom;
}


Můžeš prosím uvést příklad na třídu, která zpracovává informace a která se stará o výpisy?
Mastodont
Profil
Mmch, co dělá funkce utf8String? Nebylo by jednodušší ukládat zdrojáky přímo v UTF-8?
leedsU
Profil *
function utf8String($string) {
	if(isset($string)) {
		return iconv("cp1250", "utf-8", $string);
	}
	
}

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0