Portál AbcLinuxu, 12. května 2025 01:29

Dotaz: Jak vypsat prom. pomocí class v php

8.4.2012 13:30 Berka
Jak vypsat prom. pomocí class v php
Přečteno: 703×
Odpovědět | Admin
Ahoj, mám tyto tři sobory php a potřebuji vypsat v souboru index.php proměnné ze souboru inc.php pomocí třídy uložené v souboru class.php. Neporadí někdo? Díky
soubor inc.php
$cont = false;
$cont .= 'Nějaký text';
$cont .= 'Nějaký jiný text';

soubor class.php
class sel{
public function __construct(){
include_once(ABSPATH.'/inc.php');
}
}

soubor index.php
include_once(ABSPATH.'/class.php');
$cont = new sel();
echo $cont;
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

8.4.2012 13:47 Kit
Rozbalit Rozbalit vše Re: Jak vypsat prom. pomocí class v php
Odpovědět | | Sbalit | Link | Blokovat | Admin
Máš to hodně nešikovně napsáno, skoro bych řekl, že se s tím nedá nic rozumného dělat. Můžeš tam sice přidat metodu __toString(), ale jeví se mi to jako cesta do pekel.
function __toString() {
  include_once(ABSPATH.'/inc.php');
  return $cont;
}
Fungovat by to mělo, ale je to celé hrozně nepřehledné. Opravdu to nemůžeš napsat pořádně?
8.4.2012 13:50 Berka
Rozbalit Rozbalit vše Re: Jak vypsat prom. pomocí class v php
Opravdu to nemůžeš napsat pořádně?
Díky, určitě můžu, a poradíš jak to myslíš?
8.4.2012 13:59 Kit
Rozbalit Rozbalit vše Re: Jak vypsat prom. pomocí class v php
Například tak, že inc.php bude součástí class.php nebo bude jeho rodičem. A napiš si autoloader, ať se z těch includů neosypeš.
8.4.2012 14:10 Berka
Rozbalit Rozbalit vše Re: Jak vypsat prom. pomocí class v php
Součástí class nemuže být, jelikož těch souborů je spousta, ale jako rodič by byt urcite mohlo, ovšem je otázka jak to přesně myslíš, můžeš názornou ukázku? Díky
8.4.2012 14:40 Kit
Rozbalit Rozbalit vše Re: Jak vypsat prom. pomocí class v php
Jakých souborů je spousta? Začínám mít tušení, že něco děláš od základů špatně a že ti takovým způsobem moc nepomohu. Nemůžeš sem napsat, o co konkrétně se snažíš?

S tím rodičem by to mohlo vypadat např. takto:
//soubor inc.php
class inc{
  protected $cont;
  public function __construct(){
    $this->cont = false;
    $this->cont .= 'Nějaký text';
    $this->cont .= 'Nějaký jiný text';
  }
}
//soubor sel.php
class sel extends inc{
  public function __toString(){
    return $this->cont;
  }
}
//soubor index.php
function __autoload($class){
  include(ABSPATH.'/'.$class.'.php');
}
$cont = new sel();
echo $cont;
8.4.2012 15:23 Berka
Rozbalit Rozbalit vše Re: Jak vypsat prom. pomocí class v php
Jakých souborů je spousta?
Souborů inc.php, akorát mají jinou cestu..
/novinky/inc.php
/home/inc.php
/kontakty/inc.php
Nemůžeš sem napsat, o co konkrétně se snažíš?
Snažím se pomocí class zobrazit obsah souboru dle zadané url. Pokud nekdo zadá url
/novinky/
tak se načte obsah souboru /novinky/inc.php
/kontakty/
tak se načte obsah souboru /kontakty/inc.php. atd.. Díky

8.4.2012 15:45 Kit
Rozbalit Rozbalit vše Re: Jak vypsat prom. pomocí class v php
Tak takovou šílenost jsem už dlouho neviděl. Proč nepoužiješ databázi?
8.4.2012 16:10 Berka
Rozbalit Rozbalit vše Re: Jak vypsat prom. pomocí class v php
Proč? No jelikož ty soubory neobsahuji pouze text ale i spoustu kodu..
8.4.2012 16:34 Kit
Rozbalit Rozbalit vše Re: Jak vypsat prom. pomocí class v php
Dobrá, zkusím to tedy jinak. Ale vůbec to neodpovídá původnímu požadavku a netuším, jestli to bude fungovat. Lepší by bylo z každého modulu udělat třídu a instance vytvářet pomocí tovární metody.
//soubor $modul/inc.php
$this->cont = false;
$this->cont .= 'Nějaký text';
$this->cont .= 'Nějaký jiný text';
//soubor sel.php
class sel{
  private $cont;
  public function __construct($modul) {
    include(ABSPATH.'/'.$modul.'/inc.php');
  }
  public function __toString(){
    return $this->cont;
  }
}
//soubor index.php
function __autoload($class){
  include(ABSPATH.'/'.$class.'.php');
}
$cont = new sel($modul);
echo $cont;
Josef Kufner avatar 8.4.2012 19:44 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Jak vypsat prom. pomocí class v php
Pokud ty inc.php soubory obsahují jen data, tak z nich udělej něco parsovatelného, třeba json nebo ini a načti si je pomocí knihovní funkce (json_decode, parse_ini_file) namísto include. Je to rychlejší a lépe lze reagovat na syntaktické chyby v nich.

Pokud tam máš kód specifický pro danou sekci webu, udělej z toho třídu, která rozšiřuje nějakou základní:
// Společný soubor všem částem webu
class Page {
  // ... cokoliv používáš všude
  protected $title = '(undefined)';
  protected $config = array();  // tady máš nějaké volby

  public function getTitle() {
    return $this->title;
  }

  public function setPageConfig() {
    return $this->title;
  }

  // tato metoda by mohla byt abstract
  public function getContent() {
    // obecna stranka proste jen zobrazi index.html
    readfile($this->config['base_dir'].'index.html');
  }
}
// novinky/main.php
class Novinky extends Page {
  protected $title = "Novinky";  // getter je zděděn
  public function createContent() {
    // nacteni novinek
    $q = dibi::select('news.*, ...');
    if (isset($this->config['lang'])) {
      // pokud bylo zadano '/news/...'
      $q->where('news.Lang = %s', $this->config['lang']);
    }
    if (isset($this->config['path'][0])) {
      // pokud je url ve tvaru '/*/id'
      $q->where('news.id = %s', $this->config['path'][0]);
    }
    // ... cokoliv potřebuješ
  }
}
O samotné zpracování těchto tříd se pak postará index.php, na který na serveru nasměruješ úplně všecko.
// index.php
$path = explode('/', trim($_SERVER['REQUEST_URI'], '/'));
$page = isset($path[0]) ? $path[0] : '/'; // ošetření prázdné cesty (/)

$page_map = array(
  '/'        => array('class' => 'Page', 'base_dir' => './home/'),
  'kontakty' => array('class' => 'Kontakty'),
  'novinky'  => array('class' => 'Novinky'),
  'news'     => array('class' => 'Novinky', 'lang' => 'en'),
);

$page_config = $page_map[$page];
$page_config['path'] = array_slice($path, 1);

$class_name = $page_config['class'];

function __autoload($c) {
  include('class/'.strtolower($c).'.class.php');
     // dle tveho umisteni souboru s tridama
}

if (class_exists($class_name)) {
  $p = new $class_name();
  $p->setConfig($page_config);
  $p->createContent();
} else {
  header("Status: 404 Not Found");
  echo 'Sorry, page not found!';
}
Ve výsledku to dopadne tak, že pokud uživatel vleze na adresu http://example.com/, tak se mu zobrazí soubor ./home/index.html a pokud na http://example.com/novinky/1, tak se mu zobrazí novinka s ID 1.

Prostým přidáváním tříd a záznamů do pole $page_map si můžeš aplikaci dle libosti rozšiřovat a přitom se z toho nezblázníš.

A až tě to přestane bavit, tak sáhni po nějakém pěkném frameworku.
Hello world ! Segmentation fault (core dumped)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.