Portál AbcLinuxu, 27. července 2025 07:13


Dotaz: Jak v PHP přinutit __autoload() načítat vždy soubory s danou třídou

1.4.2017 04:09 Fana
Jak v PHP přinutit __autoload() načítat vždy soubory s danou třídou
Přečteno: 376×
Odpovědět | Admin
Ahoj. Jak funguje PHP v oblasti načítání tříd? Kdo rozhoduje o tom, zda byla již třída načtena či nikoliv a bude se načítat? I když vložím do funkce __autoload() require, include, require_once nebo include_once nikdy se třída nenačte znova, vždy jen jednou. Poradí někdo jak přinutit __autoload() aby načetl soubor s třídou vždy když se pořadovaná třída zavola? Děkuji
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

1.4.2017 07:05 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Jak v PHP přinutit __autoload() načítat vždy soubory s danou třídou
Odpovědět | | Sbalit | Link | Blokovat | Admin
PHP každou třídu načítá autoloadem jen jednou a ukládá si ji do kolekce načtených tříd. Nemá žádný důvod ji načítat podruhé, protože po načtení třídy si ji drží v paměti a opakované načítání by bylo jen plýtváním prostředky. Navíc by to způsobilo konflikt mezi původní třídou a nově načítanou třídou.

Co si mám představit pod "... když se pořadovaná třída zavola?" Při každém "new" nebo při každém volání nějaké statické metody či atributu? Jak bys chtěl rozlišit, kdy má pracovat s původní a kdy s nově načtenou třídou?
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
1.4.2017 12:45 Fana
Rozbalit Rozbalit vše Re: Jak v PHP přinutit __autoload() načítat vždy soubory s danou třídou
Ahoj a dík za info, sorry, pořadovaná třída byl jen překlep (ř/ž). A existuje tedy jiná možnost jak zjistit, že systém požaduje nějakou třídu i když ji nebude načítat (jelikož již načtená je)? Dělám takový debugger, dal jsem si s tím strašně moc práce a když přišlo na testování, tvrdě jsem narazil. Omylem jsem zavolal dvě stejné class, debugger ale vypsal pouze tu první. Mohl jsem to předpokládat ale opomněl jsem to:( Nechtěl bych poslat celý projekt šípku:( Díky.
1.4.2017 13:59 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Jak v PHP přinutit __autoload() načítat vždy soubory s danou třídou
Základním pravidlem je, že každá třída je v samostatném souboru, který je podle názvu této třídy pojmenován. Tím se bezpečně vyhneš takovým problémům, protože v jednom adresáři nelze mít dva soubory se stejným názvem.

Ještě můžeš použít namespace, třídy se shodným názvem v různých namespaces bývají v různých adresářích a mezi sebou se nehádají.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
1.4.2017 15:51 Fana
Rozbalit Rozbalit vše Re: Jak v PHP přinutit __autoload() načítat vždy soubory s danou třídou
Já se ale ptám na něco jiného, neřeším strukturu aplikace ale řeším to, jak zachytit každou volanou třídu.
1.4.2017 16:19 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Jak v PHP přinutit __autoload() načítat vždy soubory s danou třídou
Při volání třídy se PHP nejprve podívá do kolekce natažených tříd. Když ji tam najde, tak ji použije. Když ji tam nenajde, zavolá autoloader a jméno třídy mu předá jako parametr.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
1.4.2017 22:05 Fana
Rozbalit Rozbalit vše Re: Jak v PHP přinutit __autoload() načítat vždy soubory s danou třídou
No a kde odchytit to nebo "Když ji tam najde" nebo "Když ji tam nenajde". PHP přece musí vědět z jaké třídy nebo souboru se ta třída volá, jinak by nefungovalo.
1.4.2017 22:46 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Jak v PHP přinutit __autoload() načítat vždy soubory s danou třídou
To přece ví autoloader, ze kterého souboru si má tu třídu natáhnout.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
5.4.2017 11:52 DW
Rozbalit Rozbalit vše Re: Jak v PHP přinutit __autoload() načítat vždy soubory s danou třídou
Ides na to zle z principu objektoveho programovania, ak sa ti zda xdebug.profiler + cachegring moc tazky kaliber, tak by to malo vyzerat nejako takto:

  class MotherOfAllClassesInProject {
 
    __construct() {
      if(defined('DEBUG') and DEBUG=1){
        // debug actions for create instance
      }     
    }

    __destruct() {
      if(defined('DEBUG') and DEBUG=1){
        // debug actions for destruct instance
      }     
    }

  }

5.4.2017 14:56 citanus | skóre: 12 | Cork (Ireland)
Rozbalit Rozbalit vše Re: Jak v PHP přinutit __autoload() načítat vždy soubory s danou třídou
DEBUG=1

php programmers have to know their stuff : O
5.4.2017 15:38 DW
Rozbalit Rozbalit vše Re: Jak v PHP přinutit __autoload() načítat vždy soubory s danou třídou
njn, teraz viac robim v object pascale a mssql :D jasne ze tam ma byt == a kedze DEBUG nie je premenna tak by to akurat hodilo chybu $debug=1 by bolo horsie :)

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.