Autor Zpráva
tester
Profil *
Opravuji v projektu několik věcí, které jsem v minulosti udělal např. že jsem v souboru se třídou vytvořil instanci (problém vznikl s tím že jsem pak hledal kde se ta instance vytváří). Mám soubor include_classes.php a v něm by se měly includovat všechny třídy, jenže jsem v tom načítal i soubory, které už prováděly nějaké akce. Tak to jsem změnil a přesunul do init.inc.php kde se teprve ty iniciační akce vytváří včetně vytváření nových objektů. Co mi ale vadí že ty soubory, které jsem už includoval v include_classes.php, pak po mě v tom init křičely, že nemají nadefinované funkce. Nepomohlo přidat tam include toho include_classes.php, musel jsem tam zkopírovat ty samé include řádky které jsou v include_classes.php. Tohle moc nechápu jak je to možné. Ono to sice jede, ale proč to člověk musí includovat dvakrát? Používám na to include_once().

Ještě jeden dotaz dá se definice funkce nebo třídy podmínit? Například aby se definice funkce zavedla jen při spuštění z určitého souboru?


Stejný problém je i s proměnnými.
hlavní script je reg.php
tam includuju ty třídy a ve třídě language se nadefinuje pole $lan
pak v reg.php dám výpis pole a vidím že všechny hodnoty tam jsou. V reg.php dále includuju init.inc.php a v něm už tato proměnná přístupná není.
Kajman
Profil
Mrkněte v php manuálu na autoload.
tester
Profil *
Píše mi to chybu parse error, unexpected T_FUNCTION, expecting ')'

__autoload(function ($class_name) {
  if (!file_exists(C::PATH.'/classes/language_class.php') )
    echo("<strong>Error loading Language class</strong> in language_class.php line 8."); 
  else 
    include_once C::PATH.'/classes/language_class.php';
});

zkoušel jsem to i s spl_autoload_register, to samé
PHP 5.2
Tomáš123
Profil
tester:
Tak si ju prečítaj a oprav (je to kdesi na tom riadku).
tester
Profil *
Ale jo funguje to. Chyba byla v jiném souboru. Dík.


Stejně to nechápu. Mohu uvnitř té definice includovat libovolný počet souborů?

function __autoload($name) {
  if (!file_exists(C::PATH.'/classes/language_class.php') )
    echo("<strong>Error loading Language class</strong> in language_class.php line 8."); 
  else 
    include_once C::PATH.'/classes/language_class.php';

  if (!file_exists(C::PATH.'/classes/results_class.php') )
    echo("<strong>Error loading results class</strong> in include_classes.php line 14."); 
  else 
    include_once C::PATH.'/classes/results_class.php';
  
  if (!file_exists(C::PATH.'/classes/SQL_class.php') )
    echo("<strong>Error loading SQL class</strong> in include_classes.php line 19."); 
  else 
    include_once C::PATH.'/classes/SQL_class.php';

  if (!file_exists(C::PATH.'/classes/const_class.php') )
    echo("<strong>Error loading Const class</strong> in include_classes.php line 24."); 
  else 
    include_once C::PATH.'/classes/const_class.php';

  /*
  if ($a=='v' && !file_exists(C::PATH.'/classes/view_class.php') )
    echo("<strong>Error loading View class</strong> in include_classes.php line 29."); 
  else 
    include_once C::PATH.'/classes/view_class.php';


  include_once C::PATH.'/classes/cachequery.class.php';
  include_once C::PATH.'/classes/data.class.php';
  include_once C::PATH."/classes/utilities.class.php";

}

Aplikace jede, ale když pak v tom init.inc.php chci zrušit ty podruhé includované soubory tak mi to zase dává ty stejné hlášky jako před tím jak kdyby tam ten autoload nebyl.

__autoload($name); // zkusím přídat
include_once C::PATH.'/classes/mysql.class.php';
include_once C::PATH.'/classes/data.class.php';
include_once C::PATH.'/classes/cachequery.class.php';
include_once C::PATH.'/include/translate.inc.php';
include_once C::PATH.'/classes/results_class.php';

Takže odeberu např. mysql.class.php a hned to hoří
tester
Profil *
Tak nakonec je to funkční, chyba byla že jsem mysql.inc.php neměl uvedený v té funkci. Takže se mi to zkrátilo.
Martin2
Profil *
tester:
Stejně to nechápu. Mohu uvnitř té definice includovat libovolný počet souborů?
Nepřipadá ti divné, že parametr $name nikde nepoužíváš? Autoloading načítá objekty automaticky – při prvním použití.

Já vím, já vím. Užíváš nekonvenční styly v programování. Ale opravdu by ti prospělo věnovat aspoň trochu času studiu základů místo tohoto prasení.
tester
Profil *
Martin2:
Parametr $name je povinný, manuál jsem četl. Jede to. Víc neřeším.
Zechy
Profil
tester:
Ano, parametr je povinný, protože dostaneš název třídy, kterou aktuálně autoload načítá, tím pádem celá ta funkce může vypadat takhle:
function __autoload($name) {
  if(file_exists(C::PATH.'/classes/'.$name.'.php')) {
    include_once C::PATH.'/classes/'.$name.'.php';
  } else if(file_exists(C::PATH.'/include/'.$name.'.php')) {
    include_once C::PATH.'/include/'.$name.'.php';
  } else {
    echo "Třídu ". $name ." se nepodařilo najít.";
  }
}

Což i na údržbu je o dost jednodušší přidat pět složek než přidávat postupně 500 souborů.
tester
Profil *
Zechy:
Aha, to se hodí. Tím se mi opět zkrátí kód :-)

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: