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
Snad parametrem, ne?
Joker
Profil
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);  
Bez parametru pouze funkce v jiné funkci bez oop
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
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
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
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
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
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
Joker:
Jakto,že tam není funkce name?

V té třídě,je uvedena.
Joker
Profil
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
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
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::name2Samozř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
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
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
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;
}
secti je funkce. Ale secti() je volání funkce, které skončí chybou, jelikož chce 2 argumenty.
Můžeš proto klidně provést třeba:
var matematickaOperace = secti;
matematickaOperace(1, 2);
A je jen malý rozdíl mezi předchozí funkcí secti a touto:
var secti = function(a, b) {
  return a + b;
}
Tedy funkce je jakoby v proměnné secti. S touto proměnnou můžeš provádět co chceš, předávat ji jiné funkci, vracet returnem, ukládat do dalších proměnných. Samozřejmě, že je nemůžeš sčítat nebo negovat. Ale můžeš použít operátor závorky (...). Tento operátor funkci provede.
function proved(funkce) {
  return funkce(1, 2);
}
proved(secti);
Toto je jediný operátor, který funkce má. Není to tak úplně divný operátor, vzpomeň si na inkrementaci, operátor ++. Ten se také zapisuje za proměnnou. Nebo na operátor hranaté závorky [...], ten slouží k přístupu k prvku pole.
snazimse
Profil
Joker, juriad:
Děkuji ještě jednou,moc jste mi pomohli to objasnit!

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