Autor Zpráva
Shaim
Profil
Zdravím,

příklad, dejme tomu, že includuji ze souboru funkci třeba test() (jedná se o soubor, kde je spousta funkcí pro univerzální použití). Občas je potřeba udělat drobné změny, ale nechci v tomto souboru nic provádět, chci ho mít, jak je.

Je možno nějakým způsobem redeklarovat funkci?

Příklad:
file.php
function test() {
    echo 1;
}

index.php
include_once "file.php";
function test() {
    echo 2;
}
test();


Jde mi o to, aby script vypsal "2". Do původního scriptu v file.php nechci zasahovat. Rád bych to řešil pouze v rámci index.php.

Nějaké řešení? Bez nutnosti přejmenovávat funkce, apod. Jde mi o to, aby file.php zůstal pro všechny weby, kde ho používám, stejný a pouze vždycky dle aktuální potřeby změnit nějakou funkci v indexu individuálně pro každý web. Snad jsem vysvětlil, co potřebuji :)
Tori
Profil
// extraFunkce.php (přepsané)
function test() {
    echo 2;
}

// funkce.php (původní)
if (!function_exists('test')) {
    function test() {
        echo 1;
    }
}


// index.php
include './extraFunkce.php';
include './funkce.php';
Shaim
Profil
Jasně, nějak podobně jsem to chtěl taky napsat, ale já potřebuji pouze 2 soubory.

index.php ve kterém je nejdříve includování file.php a teprve poté se provádí deklarace funkce "test". Takže function_exists by v tomto případě nepomohla. Jelikož nejdřív naincluduji tu původní funkcni a tu poté potřebuji nějak přepsat.

Nějaké řešení nebo je to nereálné a budu muset využít to, co píše Tori ?
Tori
Profil
Přejmenovat / překrýt funkce se dá, ale není to asi nic, co by vám tu kdokoli doporučil jako rozumné řešení.
Ještě je možnost všechny ty funkce zabalit do jedné / více statických tříd a v index.php deklarovat potomka té třídy a pracovat pouze s ním. Pak byste si snadno u potomka překryl některou metodu.
Jakou situaci konkrétně vlastně řešíte - je to kvůli ladění, anebo něco jiného?
Joker
Profil
Shaim:
V první řadě, předeklarování funkce je hrozná prasárna. Proto to je tak složité, dokonce i v PHP, kde jinak jde leccos.
Vznikne kód extrémně složitý na údržbu; Asi nikdo nebude počítat s tím, že když si k funkci dohledá její deklaraci, není to skutečná deklarace funkce, která se z toho místa v kódu volá.

jedná se o soubor, kde je spousta funkcí pro univerzální použití
Představil jsem si to jako soubor obsahující 500 rozličných funkcí, ze kterých daný kód potřebuje tři a z nich jednu jinak, než je implementovaná v tom souboru.
V takovém případě by byl hlavní problém už existence toho souboru.

Krom toho hlavní výhoda umístění společného kódu do vkládaných souborů je, že daná funkčnost je na jednom místě a změny se dají dělat centrálně. Ve chvíli, kdy by si část skriptů tu funkci předeklarovala, tzn. při změně funkčnosti budu muset nejdřív změnit centrální funkci a pak projít všechny skripty a vyhledat a změnit předeklarované funkce, nemá existence toho include souboru smysl.

Jestli i po zvážení výše uvedeného je to předeklarování funkce pořád nutné, myslím, že s příslušným rozšířením by to šlo přes rename_function.
Alphard
Profil
Třeba by stačil konfigurační soubor, kde se nastaví různé konstanty/parametry. Těžko hádat ze známých údajů, ale přepsat funkci se nesnažte.
Shaim
Profil
Nakonec jsem využil rename_function, děkuji moc všem :)
Amunak
Profil
Shaim:
Nakonec jsem využil rename_function
...a to je přesně důvod, proč by se špatné nápady měly rovnou vyvracet, než prvně postovat kód. Shaim, prosím, nedělej to, uprav svůj kód tak, aby rename nepotřeboval.

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: