Autor Zpráva
snazimse
Profil
Zdravím všechny,

už nějakou dobu hledám na netu, jak vytvářet vlastní makra v php, podobně jako třeba v C++.
A nic jsem v podstatě nenašel, netuším zda je to nějaká přímo funkce v php, snad ano.A je možné vytvářet i párové makra?

Abych je mohl používat ve svém php systému, podobně, třeba jako nějaký framework, třeba v šablonovacím systému Latte v Nette.

Zná ,někdo nějaký článek, nebo poradí jak si nadefinovat vlastní jednoduché makro.
Třeba , abych pak mohl vykreslovat základní url v html kódu.

Máte určitě spousta z vás s tímhle zkušenosti, tak budu rád za příspěvek.Děkuji všem zúčastněným!

<a href="{baseURL}">Hlavní stránka</a> 
Alphard
Profil
V C++ jsou makra expandována ještě před kompilací, zajišťuje to preprocesor. PHP jako interpret samotný preprocesování v tomto smyslu neprovádí, takže zde pro makra není podpora.
To však neomezuje vytvoření vlastního preprocesoru (nebo použití hotového, že), např. v rámci autoloadingu lze před samotným načtením zdrojového php kódu provést překlad kódu z jiného jazyka (klidně samotným php interpretem).

Ten příklad s Latte je to, o čem mluvím. Podívej se do cache, tam jsou makra převedena do klasického php, tj. něco jako
<a href="<?php  echo $template->baseUrl; ?>">Hlavní stránka</a> 
Tj. Latte soubor se neincluduje, ale načte jako text, parsuje, uloží po preprocesingu a pak se includuje jako php soubor.
Nette je open source, takže se na to klidně můžeš podívat.

Edit: Ten kód je zjednodušený, Nette by to přinejmenším escapovalo, ale o to teď nejde.
Edit2: Samozřejmě lze překlad provést i dříve než v runtime fázi. Používá se to třeba na strojový překlad nových vlastností jazyka do podoby kompatibilní se staršími verzemi.
Edit3: už PHP samotné je preprocesor pro html, jak má v názvu :-)
snazimse
Profil
Alphard:

Děkuji moc za reakci a jak se to provádí, ta kompilace, z jakých jazyků? Můžete uvést nějaký příklad? Nebo píše se o tom někde podrobněji? Abych to nějak pochopil a věděl jak na to. Jj v C++ ,je to jasné, tam se to jen nadefinuje. Jak dostat předtím do stránky pomocí např php funkce ob_start , dá se ?

Já jsem viděl někde v kódu, takovýto podobný kód zhruba, jen můj názorný příklad:

$baseurl = str_replace("{baseURL}", $this->config->configurl());

A to pak dělá co, nahrazuje makro , za hodnotu, jakou chci? Ale to ,až když jsou ty makra vytvořené, že ano?

Potřeboval ,bych o tom někde něco načíst, nepíše se o tom někde? V php dokumentaci, jsem nic nenašel, ale to bude teda tím, že PHP to nepodporuje jako interpret, tedy.Ani nějaký rozumný článek jsem nenašel.Ono předpokládám, to asi nikdo moc nedělá, proto se asi využívají hlavně ty šablonovací systémy, ty už to mají v sobě je to tak?


Děkuji za veškeré rady! Snad to nějak pochopím.
Keeehi
Profil
snazimse:
Potřeboval ,bych o tom někde něco načíst, nepíše se o tom někde?
Pochybuji. Tedy nějaké jednoduché nahrazování řetězců řetězcem by se určitě našlo ale to se nedá považovat za klasický šablonovací systém. Vytvoření něčeho takového je velmi komplexní záležitost, je k tomu potřeba spousta znalostí takže na to nějké jednoduché návody nenajdeš. Doporučil bych vybrat si nějaký systém a ten třeba rozšiřovat místo stavění vlastního úplně od základů.
snazimse
Profil
Keeehi:

No to chápu, ale kdyby třeba aspoň pro začátek, si takhle mohl vypsat alespoň nějaké nepárové makro,

např zmíněné: {baseURL}

Děkuji!
aDAm
Profil
vem si latte z nette či smarty a tam uvidíš co se děje. šablona se zkompiluje a výsledek je už pak jiný.
snazimse
Profil
aDAm:

Jako jo díval jsem se na to no, takže jediný způsob jak používat makra v php, je ,že musím používat šablonovací systém,
nebo si vytvořit vlastní kompilátor , který to převede, ještě před načtením zdrojáku?

Rozumím tomu správně?
juriad
Profil
snazimse:
Problém je v tom, že to co ty chápeš pod pojmem makro PHP nemá. Můžeš to tedy obcházet několika různými způsoby a šablonování je jedním z nich. A protože v šabloně je cílem někam na výstup vložit nějakou hodnotu, můžeš to považovat za jakousi náhradu maker.
Ale obecně Céčková makra neslouží jen k definování hodnot, ale i k dost divokému ovlivňování vkládání souborů a samotné kompilace, a naopak šablony neslouží jen k tupému vkládání konstantní hodnoty, ale i třeba generování jednotlivých řádků HTML tabulek.

Takže nejlépe bude, když na makra tak, jak jsou v C zapomeneš. Je velice pravděpodobné, že hledáš právě šablony.
snazimse
Profil
juriad:

Rozumím, byl bych rád, kdyby o tom byl někde článek, či něco podobného.Co myslíte, tím různými způsoby?

Já bych potřeboval prostě si určit jen pár maker třeba, kvůli přehlednosti, nepotřebuji třeba iteraci v makru.

Mě jde o to jak si vytvořím nejjednodušeji, to obejít abych nemusel používat celý šablonovací systém, jednoduché makro,

právě uvedené {baseURL}, jestli to lze nějak, nebo musím mít šablonovací systém, či vlastní kompilaci.Nebo nějakou zjednodušenou.

Jestli by jste uvedl, nějaký příklad?

Děkuji!
Jan Tvrdík
Profil
snazimse:
Já furt nechápu co si představuješ pod termínem makro. Ty příklady které tu ukazuješ jsou obyčejné proměnné, které jde implementovat třeba přes str_replace.

Ale jinak prakticky neexistují rozumné důvody, proč na webu nepoužít nějaký hotový šablonovací systém. Vzhledem k tomu, že se šablony kompilují, tak použití šablonovacího systému může dokonce web zrychlit.
Alphard
Profil
Kdysi dávno jsem napsal tohle php šablona, je to nejjednodušší verze, využívá se přímý string replace.
Mírně složitější verze s replace callback je na Přerušení echo, naincludování souboru, pokračování echo.

Pro složitější případy bude jednodušší použít (resp. naučit se používat) hotový šablonový systém než si to psát sám (což je navíc v tuto chvíli nad vaše schopnosti).
snazimse
Profil
Jan Tvrdík, Alphard:

Děkuji moc za odpověďi, fakt jste mi hodně pomohli!. Alphard, to je přesně co jsem potřeboval vidět, jak to funguje. No já to jako zas tak moc neovládám, pro vás to asi není moc, ale jako snažím se , jak mám v nicku co nejvíc, ale přiznávám, ne vždy bohužel mi to jde.

Já furt nechápu co si představuješ pod termínem makro.
No, možná bych si to rád od vás poslechnul, jelikož, se mi to asi plete.

Vezmu pro příklad Latte z Nette: to je párové makro, je to tak?

{if $value}
    yes
{else}
    no
{/if}

A můj příklad s {baseURL} , je tedy co?

Je to tak, že když bych to udělal přes php funkci str_replace, tak je to obyčejná proměnná a kdybych to dělal přes preprocesor, tak je to již makro? Nebo v nějakém šablonovacím systému např. Smarty,nebo Latte s kompilací.
martin1312
Profil
snazimse:
Makro to nie je nikdy. Ako písali predomnou, v PHP makra neexistujú.
Tvoj príklad s {baseURL} je iba označený text zložitými zátvorkami a túto "značku" môžeš potom nahradiť iným stringom/číslom, napríklad cez funkciu str_replace, ako už bolo povedané. Alebo ti to nahradí šablonovaci systém.
Jan Tvrdík
Profil
snazimse:
Vezmu pro příklad Latte z Nette: to je párové makro, je to tak?
Ano, v terminologii šablonovací systému Latte slovo „makro“ existuje, v terminologii PHP (obecně) nikoliv. Proto může být lepší místo „makro“ říkat „Latte makro“, pak je všem jasné, co se tím myslí.

Je to tak, že když bych to udělal přes php funkci str_replace, tak je to obyčejná proměnná a kdybych to dělal přes preprocesor, tak je to již makro?
Ne, tak to nefunguje. Jakmile jsi mimo Latte, tak termín „makro“ není v PHP definovaný, takže chceš-li slovo makro používat, tak se musíš odvolat na definici již existující nebo si můžeš vymyslet definici vlastní.
snazimse
Profil
martin1312, Jan Tvrdík

Ok, super vysvětlení ,perfekt no takže jakoby je to záležitost, čistě Latte zatím, a ve Smarty, se tomu říká jak potom? Mě spíš v tomhle smyslu zajímalo, jak se pak tomuhle způsobu vykreslování v dané šabloně říká, vlastně tam, kde nemusím používat php kód přímo.Ale takhle to zkracuju do složených závorek, nejpoužívanějším způsobem.
Jan Tvrdík
Profil
Smarty tomu myslím říká tagy.


jak se pak tomuhle způsobu vykreslování v dané šabloně říká
Většinou se tomu říká použít šablonovací systém.
snazimse
Profil
Jan Tvrdík:

Aha dobře, tak jo děkuji!

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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