Autor Zpráva
VVenda
Profil *
Ahoj, poradíte prosím někdo, proč mi tato metoda nic nevrací? Pokud obsah souboru foo.php vložím přímo do té metody tak to funguje, ale v souboru ne. Díky za pomoc

/* metoda uvnitř class */
public function foo() {
include('/foo.php');
}

/* soubor foo.php */
<?php
if($a)
return true;
else
return false;
?>
Tori
Profil

public function foo() {
    return include('/foo.php');
}
- ale musíte zajistit, že includovaný soubor bude v jakékoli situaci (i při chybě) vracet nějakou smysluplnou hodnotu (aby nedošlo k situaci, že includovaný soubor z důvodu nějaké chyby nevrátí nic, ale z metody přijde hodnota 1, tedy implicitní návratová hodnota include).
Joker
Profil
VVenda:
Ten kód nedělá to, co si myslíte.

V tom vloženém souboru se return nachází v hlavním skriptu. To znamená, že ukončí zpracování skriptu a -protože jde o vložený skript- vrátí hodnotu nadřízenému skriptu, kde bude výsledkem příkazu include.

Čili výsledkem může být například:
public function foo() {
true;
}
Což samozřejmě nic neudělá a nic nevrátí.

Dále viz [#2] Tori.

Ještě bych poznamenal, že mi nepřipadá jako úplně dobrý nápad vkládat vnitřky metod z externího souboru. Dal bych si do externího souboru celou třídu. Jestli je ten kód její metody potřeba na více místech, volal bych z těch dalších míst danou metodu té třídy.
Pokud je metoda ve třídě, kterou se na těch ostatních místech nehodí vkládat, uspořádal bych objektový model tak, aby ta metoda byla ve třídě, která se tam hodí.
VVenda
Profil *
Díky Vám za pomoc, to mne nenapadlo. ;-)
IHMO: Proč Vám nepřipadá jako úplně dobrý nápad vkládat vnitřky metod z externího souboru. Co je na tom špatného? Každá metoda má cca 100 řádků a když mám v jedné class i 30 metod tak je kod nepřehledný. Nenapadá mne jak to lépe udělat.


Ještě se zeptám k tomu 'include'. Je bezpečný takový zápis?
include('/foo.php'); Nemělo by tam být z důvodu podstrčení útočníkem spíše
include('/home/virtual/domain1/www/classes/methods/Foo/foo.php');
Děkuji za upřesnění


Tori:
Předpokládám, že pokud nechci aby metoda něco vracela volajícímů té metody, tak tam ten return před include být nemá?
Tori
Profil
VVenda:
Každá metoda má cca 100 řádků a když mám v jedné class i 30 metod tak je kod nepřehledný
Jedna třída snadno může mít několik tisíc řádků. Ale stořádkové metody se mi zdají moc - to bych spíš viděla jako špatně navrhnuté metody, které dělají několik věcí naráz. Kdybyste s tím chtěl poradit, dejte asi raději ten kód na pastebin.com, sem by se do jednoho příspěvku nevešel. edit: navíc si takhle komplikujete mnoho věcí, i třeba jen obyčejné přejmenování jedné proměnné třídy. Já si (v Netbeans) jen kliknu na definici té proměnné, Ctrl+R, napíšu nové jméno, a je to přejmenované ve všech metodách. U vašeho kódu by bylo nutné otevírat všechny includy pro tu třídu a ručně nahrazovat.

Nemělo by tam být z důvodu podstrčení útočníkem spíše
Jestli získáváte název souboru zvenčí, tak by tam nějaká ochrana být určitě měla. Jinak z důvodu funkčnosti jak na localhostu, tak na ostrém serveru bych spíš hned na začátku aplikace uložila cestu k hlavnímu adresáři do konstanty, a pak používala pouze relativní cesty vůči této konstantě. Např.:
define('APP_ROOT', __DIR__);
// a jinde:
include APP_ROOT . '/classes/methods/Foo/foo.php';

Předpokládám, že pokud nechci aby metoda něco vracela volajícímů té metody, tak tam ten return před include být nemá?
Buď, anebo může volající tu návratovou hodnotu ignorovat.
Joker
Profil
VVenda:
Proč Vám nepřipadá jako úplně dobrý nápad vkládat vnitřky metod z externího souboru. Co je na tom špatného?
Pak v těch externích souborech jsou kusy kódu u kterých není zřejmé, k čemu vlastně patří.

Každá metoda má cca 100 řádků a když mám v jedné class i 30 metod tak je kod nepřehledný.
Aha, takže důvodem toho je, že kód v hlavním souboru zabírá místo?
Pořiďte si editor podporující sbalování kódu (jak to funguje viz třeba obrázky zde).

Doplnění: Některé vhodné editory pro PHP, placené i zdarma, jsou zmíněné ve vlákně Jaký editor pro PHP (přehled editorů).

Jinak, jak píše i Tori, 100 řádků na metodu je hodně.
VVenda
Profil *
Joker:
Jinak, jak píše i Tori, 100 řádků na metodu je hodně.
A to z důvodu přehlednosti nebo ztráty rychlosti PHP při zpracování ?


Joker:
Aha, takže důvodem toho je, že kód v hlavním souboru zabírá místo?
Ano, přesně ten důvod..
Tori
Profil
VVenda:
Z důvodů: čitelnosti, přehlednosti, testovatelnosti a optimalizace, možnosti měnit vnitřek funkce nezávisle na ostatních, ...
Co se týká rychlosti - jeden dlouhý soubor se načte rychleji, než krátký soubor obsahující desítky includů. Proto se často celé frameworky komprimují do jednoho velkého souboru.
Joker
Profil
VVenda:
A to z důvodu přehlednosti nebo ztráty rychlosti PHP při zpracování ?
Ono to vyplývá už z principu, že jedna metoda má dělat jen jednu činnost. Na jednu činnost obvykle tolik kódu není potřeba, takže když tam tolik kódu je, dělá metoda víc různých věcí a měla by se rozpadnout do více metod.
(Doplnění: Samozřejmě jsou výjimky, kdy takové množství kódu prostě nutné je.)

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:

0