Autor | Zpráva | ||
---|---|---|---|
snazimse Profil |
Zdravím,
potřeboval bych nějakým rozumným,správným způsobem. Dostat výsledek z funkce z určité třídy oop. Ten výsledek potřebuji dostat v obyčejné funkci bez oop. Tzn: Abych si předal výslednou proměnnou z funkce ve třídě mimo třídu do neobjektové funkce. Díky všem! |
||
Alphard Profil |
#2 · Zasláno: 13. 10. 2014, 21:16:53
Snad parametrem, ne?
|
||
Joker Profil |
#3 · Zasláno: 13. 10. 2014, 21:44:36
snazimse:
To je jednoduché, veškerá komunikace mezi funkcí a okolím by měla být přes parametry a návratovou hodnotu. |
||
snazimse Profil |
Joker, Alphard:
Takže normálně? Jen se pro jistotu ptám.Abych nemíchal něco.Přece jenom sem nepoužíval nikdy hodnoty z oop v neobjektovým funkcích. Takže vlastně mi mělo stači aby funkce byla public a vracela pomocí return hodnotu,nebo s parametrem,který pak předám kdekoliv? A vzdáleně to musím načíst přes require či include.Ano? Příklad s parametrem require_once ("class-something.php"); echo foo($example); require_once ("class-something.php"); function doit () { echo foo(); } Protože,když mám celou třídu v nějakém souboru a na includuju to.Tak se mi třeba sekne stránka,protože se asi vypíšou všechny funkce. A dost možná,se načtou dvakrát,protože je používám,už někde. Díky moc! |
||
Alphard Profil |
#5 · Zasláno: 13. 10. 2014, 23:08:58
„Takže vlastně mi mělo stači aby funkce byla public a vracela pomocí return hodnotu,nebo s parametrem,který pak předám kdekoliv?“
Radši pomocí return, referencovat přes parametr pouze v krajní nouzi. Ale jinak ano. „Přece jenom sem nepoužíval nikdy hodnoty z oop v neobjektovým funkcích.“ Bavíme-li se o základních datových typech, není v tom rozdíl. „A vzdáleně to musím načíst přes require či include.Ano?“ Nejlépe mít celou aplikaci objektovou a pro načítání používat autoload. Pak odpadnou starosti s tím, co se kde načítá. |
||
snazimse Profil |
#6 · Zasláno: 14. 10. 2014, 12:23:51
Alphard:
A ten autoload,by pak měl být celá třída v nějakém projektu.Kde se bude všechno načítat? Chápu to dobře? V tom manuálu je i jakási funkce podobná konstruktoru se dvěma podržítkama <?php function __autoload($class_name) { include $class_name . '.php'; } $obj = new MyClass1(); $obj2 = new MyClass2(); ?> Přítom,tam kde je třída autoloader,tak tam se tohle nepoužívá.Místo toho tam spl_autoload. A všechny autoloady se dají používat,jen v oop? Ano? Díky! |
||
snazimse Profil |
#7 · Zasláno: 14. 10. 2014, 14:24:15
Alphard, Joker:
Tak asi zae něco dělám špatně. Jak dám require načtu si to do mojí neobjektové funkce, tak v tělo této funkce si vypíšu tu funkci z require třídy. A pak to načtu,jakmile se načítá web,tak v tom místě kde se má vypsat výsledek,tak se to sekne,a dále už se nenačte nic ani výsledek se nevrátí. Prostě z té třídy to nemohu dostat.Proto jsem se na to ptal.A o tom jsem fakt nikde nic nečetl. Díky. |
||
juriad Profil |
#8 · Zasláno: 14. 10. 2014, 14:55:25
snazimse:
Myslím, že je problém, že neznáš rozdíl mezi funkcí a metodou. Metoda je funkce, která je definovaná uvnitř třídy. Jako takovou ji nelze zavolat bez kontextu objektu (či třídy pokud je static ).
class Trida { public function metoda($a) { return $a; } public static function statickaMetoda($a) { return $a; } } function funkce($a) { return $a; } Přestože všechny mají v deklaraci uvedeno function, volají se pokaždé jinak. $objekt = new Trida(); echo $objekt->metoda(1); echo Trida::statickaMetoda(1); echo funkce(1); Jinak to ani není možné. Mějme třeba takovouto třídu. Zavolat getDalsi() bez toho, aby PHP vědělo, o který seznam se jedná moc dobře nejde, nedává to smysl. U statické metody getPocetSeznamu() by to sice dávalo smysl, ale vynucením kvalifikace názvem třidy se umožnilo její jmenné oddělení. Několik třídy může mít každá jednu stejně pojmenovanou statickou metodu.
class Seznam { private static $seznamu = 0; private $ukazatel = 0; public function __construct($pole) { $this->pole = $pole; self::$seznamu++; } public function getDalsi() { $ret = null; if(isset($this->pole[$this->ukazatel])) { $ret = $this->pole[$this->ukazatel]; $this->ukazatel++; } return $ret; } public static function getPocetSeznamu() { return self::$seznamu; } } $s1 = new Seznam([1,2,3,8]); $s2 = new Seznam([1,3,5]); while(($hodnota1 = $s1->getDalsi()) != null && ($hodnota2 = $s2->getDalsi()) != null) { echo "[$hodnota1, $hodnota2]\n"; } echo Seznam::getPocetSeznamu(); |
||
snazimse Profil |
juriad:
Volají se jinak to jistě, ale uvnitř třídy,já potřebuji mimo třídu,vy ukazujete postupy uvnitř třídy.Jinak by se měli volat,tak jak jsme řešily výše. Ale já potřebuji získat funkce ze třídy,mimo třídu ve funkci neobjektové,která s danou třídou nemá nic společného. Příklad: <?php /** * */ class Something { function __construct() { $this->name = "Name"; $this->version = "2.0"; } public function name () { $name = $this->name; return $name; } } ?> Pak mám vzdálený soubor.Kde si to potřebuji získat,ale to mi nejde.Web to nenačte a sekne se to. <?php /*No OOP*/ function getnamefromclass () { require_once ("/myfolder/class-Something.php"); $getname = name(); return $getname; } echo getnamefromclass(); ?> |
||
Joker Profil |
#10 · Zasláno: 14. 10. 2014, 15:29:39
snazimse:
„Web to nenačte a sekne se to.“ Tak první věc je na vývojovém serveru si zapnout chybové hlášky. Viz Základní kurz 5: Hledání a oprava chyb ve skriptu Jinak ten poslední uvedený kód ani fungovat nemůže, není v něm žádná funkce jménem name .
|
||
snazimse Profil |
#11 · Zasláno: 14. 10. 2014, 17:26:28
Joker:
Jakto,že tam není funkce name? V té třídě,je uvedena. |
||
Joker Profil |
#12 · Zasláno: 14. 10. 2014, 17:30:25
snazimse:
Ne, není. V té třídě je metoda Something::name . Jak se už snažili kolegové vysvětlit, to je úplně něco jiného, než funkce name .
Pro vyvolání té metody name nejdřív potřebujete nějaký objekt třídy Something*. * Existují i statické metody, kde není potřeba mít vytvořený konkrétní objekt (instanci), ale to není tento případ. |
||
snazimse Profil |
#13 · Zasláno: 14. 10. 2014, 19:52:08
Joker:
Tak to jsem mimo asi. Já myslel,že takhle se volají ,jen statické metody. Tohle mi funguje jen u stringu ale většina metod asi vrací pole. Píše mi to pak error : PHP Warning: sort() expects parameter 1 to be array, string given in Nemohu přijít na to,jak tuhle hlášku zrušit,co tam mám předat,když tam není žádný parametr,a píše mi to tohle? Díky |
||
Joker Profil |
#14 · Zasláno: 14. 10. 2014, 20:04:39
snazimse:
„Já myslel,že takhle se volají ,jen statické metody.“ To je obecný formální zápis, ve skutečném skriptu by se to volalo přes objektový operátor ->
|
||
snazimse Profil |
Alphard, Joker, juriad:
Děkuji všem za reakce.Pomohli jste mi!Teď si to předávám.Přes novou instanci celé třídy. Uvnitř neobjektové funkce a funguje to.Takže si celou třídu hodím do nového objektu. require_once ("/myfolder/class-Something.php"); $newobject = new Something(); echo $newobject->name(); Je to správně? Jinak proč mi ten formální obecný zápis: Something::name2 Samozřejmě metoda existuje. Nefunguje.
Funguje,jen u některých metod ze třídy. Jinak mi to píše např error třeba Fatal error: Undefined class constant 'name2' in
Ale když si dám objekt,tak vše funguje.Jak je to možné? A k čemu se používá ten obecný formální zápis? Mě se to plete se statický metodami. Kde se to takto volá. Dík za vysvětlení,od zkušených! |
||
Alphard Profil |
#16 · Zasláno: 15. 10. 2014, 01:30:13
Formální zápis není primárně určen k zápisu v programovacím jazyce, používá se třeba v dokumentaci, vyjadřuje spíše vztahy v rámci třídy. Nicméně, shoduje se se syntaxí pro volání statických prvků, takže funguje právě u nich.
„Jinak mi to píše např error třeba Fatal error: Undefined class constant 'name2' in “
Nejsou tam závorky, takže nejde o volání funkce, ale konstanty php.net/manual/en/language.oop5.constants.php. „Je to správně?“ OOP není o jiné syntaxi, ale o jiném přístupu k programování. Ty tři řádky jsou napsány syntakticky správně, nicméně na tom není co hodnotit, to je ten nejmenší krůček... Doporučuji přečíst si o tom něco od začátku. |
||
snazimse Profil |
#17 · Zasláno: 15. 10. 2014, 13:17:48
Alphard:
Ano chápu to již,správně. Jen nevím,proč viz Joker: V té třídě je metoda Something::name. Jak se už snažili kolegové vysvětlit, to je úplně něco jiného, než funkce name. Ale ten formát tedy,nejde volat? To bych volal,konstantu té třídy ano? Musel bych volat tedy Something::name() kdybych chtěl bez instance. Pak nechápu proč mi Joker řekl.V té třídě je metoda s označením Something::name. Tak jsem to i tak volal potom. Sice jsem z erroru poznal,že hledá konstantu,ale i tak.Mě to pak spletlo. Takže konstanty se volají takto : Something::name
Funkce(metody) takto Something::name()
Pokud bych nevytvořil nový objekt. |
||
Joker Profil |
#18 · Zasláno: 15. 10. 2014, 13:45:37
snazimse:
„Pak nechápu proč mi Joker řekl.V té třídě je metoda s označením Something::name. Tak jsem to i tak volal potom.“ Jenže tak se to nevolá. To nebyl PHP kód, ale vyjádření v češtině. Something::name označuje vlastnost (v našem případě metodu) jménem name třídy jménem Something .
V PHP kódu u instanční metody pochopitelně nebude Something ani :: , ale instance té třídy a objektový operátor. Když si o té třídě obecně povídáme, žádnou instanci nemáme a ani nevíme, jak se v konkrétním kódu ta instance. Proto se to zapíše takhle.
> Takže konstanty se volají takto : Something::name
> Funkce(metody) takto Something::name()
To druhé by byla statická metoda. Instanční metoda se volá instance ->name() (kde instance je instance příslušné třídy).
|
||
juriad Profil |
Konstanty se nevolají, ale přistupuje se k nim.
Z dokumentačního hlediska se každá metoda statická či nestatická zapisuje stejně; koukni na http://php.net/manual/en/class.mysqli.php V horní části máš deklarace metod - statické poznáš podle modifikátoru static (je tam jediná - poll). Proměnné poznáš snadno, jsou nahoře a neobsahují závorky. Toto je vlastně kus zdrojového kódu. Ve spodní části jsou uvedená jen jména metod. Aby bylo zřejmé, že patří do té třídy je před nimi název třídy oddělený čtyřtečkou :: . Proměnné poznáš podle dolaru. Toto je velice zjednodušený seznam, který se zdrojovým kódem nemá moc společného. Ta čtyřtečka říká vlastně něco jako: metoda M ze třídy T. Nesouvisí to s tím, jak se taková metoda bude volat. Pokud je metoda statická (existuje jen v rámci třídy a je nazávislá na instancích), volá se náhodou také přes čtyřtečku. Ještě k té metodě Mysqli::poll - všimni si, že vrací informace o všech připojeních k databázi - nikoli jen ke konkrétnímu. Tedy to nemůže být instanční metoda - ta ví informace jen o své instanci připojení. Jestli přistoupíš ke konstantě nebo zavoláš funkci poznáš podle závorek - jestli je použiješ, bude to metoda. Z toho důvodu se konstanty zapisují výhradně VELKÝMI PÍSMENY, aby se odlišily. Zkus si dávat pozor a vždy důsledně rozlišovat metody a funkce. Znáš-li trochu javascript (příklad jazyka, kde funkce závorky vlastně nemá a ty závorky slouží k volání funkce. Další text si neber příliš do hlavy, popisuje dost netradiční pohled na programování. Mohlo by tě to docela zmást. function secti(a, b) { return a + b; } Můžeš proto klidně provést třeba: var matematickaOperace = secti; matematickaOperace(1, 2); var secti = function(a, b) { return a + b; } function proved(funkce) { return funkce(1, 2); } proved(secti); |
||
snazimse Profil |
#20 · Zasláno: 16. 10. 2014, 18:40:20
Joker, juriad:
Děkuji ještě jednou,moc jste mi pomohli to objasnit! |
||
Časová prodleva: 10 let
|
0