php5, include_once
php5, include_once
čafte..
mám jednu triedu, pre includovanie súborov (ktorá obsahuje debug, atď)..
sú 2 súbory..
v tom prvom includujem ten druhý súbor a následne ho zobrazujem..
problém spočíva v tom, že v tom prvom súbore ešte pred include vytváram zopár inštancií na triedy, ktoré chcem taktiež používať v tom druhom súbore..
momentalne to mám riešené cez type hinting, ale to mi príde dosť škaredé..
zádrhel je ten, že to čo sa includuje je obsahom len danej inštacie (resp. to includujem len cez :: ), nie scriptu..
nejaký nápad? thx
mám jednu triedu, pre includovanie súborov (ktorá obsahuje debug, atď)..
sú 2 súbory..
v tom prvom includujem ten druhý súbor a následne ho zobrazujem..
problém spočíva v tom, že v tom prvom súbore ešte pred include vytváram zopár inštancií na triedy, ktoré chcem taktiež používať v tom druhom súbore..
momentalne to mám riešené cez type hinting, ale to mi príde dosť škaredé..
zádrhel je ten, že to čo sa includuje je obsahom len danej inštacie (resp. to includujem len cez :: ), nie scriptu..
nejaký nápad? thx
asi je to tou rannou hodinou ale vobec som ta nepochopil
skus lepsie vysvetlit kde je problem.
avsak v php5 ak vytvaras triedy mozes na include napisat aj autoloader kde mozes vyhodnotit nazov triedy a podla toho includnut co potrebujes. Tento sposob je vsak evidentne pomalsi ako ked pouzijes include_once tam kde ho potrebujes
ak ti vsak nejaky inklud zapisuje hned nieco do vystupu (echo) a ty to nechces alebo by si to radzej mal v premennej tak sa to da cez ob_.....
a len na okraj hinting neni skareda vec 
avsak v php5 ak vytvaras triedy mozes na include napisat aj autoloader kde mozes vyhodnotit nazov triedy a podla toho includnut co potrebujes. Tento sposob je vsak evidentne pomalsi ako ked pouzijes include_once tam kde ho potrebujes
Kód: Vybrať všetko
<?php
function __autoload($class_name)
{
require_once $class_name . '.php';
}
$obj = new MyClass1();
$obj2 = new MyClass2();
?>
ak ti vsak nejaky inklud zapisuje hned nieco do vystupu (echo) a ty to nechces alebo by si to radzej mal v premennej tak sa to da cez ob_.....
Kód: Vybrať všetko
<?php
ob_start();
echo "Hello World";
$out = ob_get_clean();
$out = strtolower($out);
var_dump($out);
?>
..on myslí asi thak, že keď má súbor, v ktorom má vytvorené inštancie tried, za tým má includnutý súbor a v ňom chce používať objekty z toho súboru, ktorý includuje ten v ktorom chce používať tie objekty, či ich položky..
no neviem, ono to nejde, aby includnutý súbor používal triedy a objekty ktoré sú v súbore ktorý ho includuje?
.. možno som len zle pochopil.. to to ráno 
no neviem, ono to nejde, aby includnutý súbor používal triedy a objekty ktoré sú v súbore ktorý ho includuje?
ja som to pochopil tak isto .. a preco by nesli pouzit staticke atributy?Nosferatu napísal:..on myslí asi thak, že keď má súbor, v ktorom má vytvorené inštancie tried, za tým má includnutý súbor a v ňom chce používať objekty z toho súboru, ktorý includuje ten v ktorom chce používať tie objekty, či ich položky..
no neviem, ono to nejde, aby includnutý súbor používal triedy a objekty ktoré sú v súbore ktorý ho includuje?.. možno som len zle pochopil.. to to ráno
ok, sorry, horšie som to asi nemohol napísať
carnaby, ten autoload mi ja na nič, ale inak zaujímavá vec..
a ten hinting, mne to pekne nepríde, 8 inštancií takto tlačiť do toho objektu... hm.. a ten ob_* tam mám, lebo je to template to, čo sa includuje a následne ešte priraďujem obsah na určité časti tej predlohy.. ale dííík za snahu
ale k tomu vysvetleniu..
[subor:1]
[subor:2]
= čiže by som chcel aby sa zobrazilo 10, bez hintingu a s tým, že by include_once ostalo v triede.. (samozrejme keď ho dám mimo triedy, išlo by to)
problémom sa to nedá nazvať, ja len skôr dúfam, že existuje pri triedach niečo ako pri funkciách (global), akurát už v nejakom lepšiom štádiu..
carnaby, ten autoload mi ja na nič, ale inak zaujímavá vec..
a ten hinting, mne to pekne nepríde, 8 inštancií takto tlačiť do toho objektu... hm.. a ten ob_* tam mám, lebo je to template to, čo sa includuje a následne ešte priraďujem obsah na určité časti tej predlohy.. ale dííík za snahu
ale k tomu vysvetleniu..
[subor:1]
Kód: Vybrať všetko
<?
$x = new nejakaTrieda;
$x->blabla = 10;
class includeTrieda
{
public function __construct($subor)
{
if(!@include_once($subor))
{
..debug..
}
}
}
new includeTrieda('subor:2');
?>
Kód: Vybrať všetko
<?=$x->blabla;?>
problémom sa to nedá nazvať, ja len skôr dúfam, že existuje pri triedach niečo ako pri funkciách (global), akurát už v nejakom lepšiom štádiu..
Cez globálne polia by to šlo takto.. tiež som mal podobný problém a keďže sa mi to necelo riešiť spravil som to takto.. ale neni to najlepší spôsob, ale funguje
<?
$GLOBALS["x"] = new nejakaTrieda;
$GLOBALS["x"]->blabla = 10;
class includeTrieda
{
public function __construct($subor)
{
if(!@include_once($subor))
{
..debug..
}
}
}
new includeTrieda('subor:2');
?>
a tamtá trieda by mohla fungovať nejak takto aj.. a potom nemáš problém s tým druhým súborom..<?=$GLOBALS["x"]->blabla;?>
Kód: Vybrať všetko
class includeTrieda
{
public function __construct($subor)
{
if(!subor)
{
..debug..
}
}
}
new includeTriedy(@include_once('subor:2'));
rád som pomohol
..
no ja by som to $x nepchal do tej triedy, lepšie by asi bolo to druhé čo som napísal, tj. vyhodiť include von z triedy a debugovať len návratovú hodnotu includu (tj. false pri zlyhaní) vtedy sa trieda natiahne priamo na úroveň ostatných a nie do tej jednej, čo som predtým aj ja robil a zistil som že to neni moc dobré.. začal som používať globálne polia, ale to v OOP nemá čo robiť..
no ja by som to $x nepchal do tej triedy, lepšie by asi bolo to druhé čo som napísal, tj. vyhodiť include von z triedy a debugovať len návratovú hodnotu includu (tj. false pri zlyhaní) vtedy sa trieda natiahne priamo na úroveň ostatných a nie do tej jednej, čo som predtým aj ja robil a zistil som že to neni moc dobré.. začal som používať globálne polia, ale to v OOP nemá čo robiť..
v OOP nema co robit ani samostatna premenna mimo triedyNosferatu napísal:rád som pomohol..
no ja by som to $x nepchal do tej triedy, lepšie by asi bolo to druhé čo som napísal, tj. vyhodiť include von z triedy a debugovať len návratovú hodnotu includu (tj. false pri zlyhaní) vtedy sa trieda natiahne priamo na úroveň ostatných a nie do tej jednej, čo som predtým aj ja robil a zistil som že to neni moc dobré.. začal som používať globálne polia, ale to v OOP nemá čo robiť..
chapem ako nechapem preco...
rozumiem vsetkemu no nerozumiem aky benefit stoho ma byt. OOP za kazdu cenu ? naco vytvarat instanciu triedy ked tam prebehne akurat konstruktor mozno par volani nejaky log a instancia zanika ??? to uz radsej staticka trieda pripadne triedy s vlastnym factory pripadne instancie singleton ci manager instancii.
rozumiem vsetkemu no nerozumiem aky benefit stoho ma byt. OOP za kazdu cenu ? naco vytvarat instanciu triedy ked tam prebehne akurat konstruktor mozno par volani nejaky log a instancia zanika ??? to uz radsej staticka trieda pripadne triedy s vlastnym factory pripadne instancie singleton ci manager instancii.
ja osobne by som to riesil sposobom, kedy sa vyuziva prostredny (sprostredkovatelsky) objekt
[class.nejakaTrieda.php]
[class.Trieda.php]
[index.php]
[subor.php]
[class.nejakaTrieda.php]
Kód: Vybrať všetko
<?
class nejakaTrieda
{
public $blabla;
public function __construct()
{
}
}
?>Kód: Vybrať všetko
<?php
require_once "class.nejakaTrieda.php";
class Trieda
{
static private $_instance;
public function __construct()
{
}
public static function &Create($return=true)
{
if (!isset(self::$_instance))
{
self::$_instance = new nejakaTrieda();
}
if( $return )
return self::$_instance;
}
static public function get($name)
{
if( !isset(self::$_instance) )
self::Create(false);
$arr = get_object_vars(self::$_instance);
if( array_key_exists($name, $arr) )
{
return self::$_instance->$name;
}
else
return "co vlastne chces????";
}
}
?>Kód: Vybrať všetko
<?php
require_once "class.Trieda.php";
class includeTrieda
{
public function __construct($subor)
{
if( file_exists($subor) )
{
ob_start();
include_once($subor);
$output = ob_get_contents();
ob_end_clean();
echo $output;
}
}
}
$x = Trieda::Create();
$x->blabla = 10;
new includeTrieda('subor.php');
?>Kód: Vybrať všetko
<?=Trieda::get("blabla"); ?>