Php kontrola existencie funkcie. Použitie funkcií isset() a array_key_exists(). Inicializácia a vymazanie premennej v PHP

  • 20.06.2020

Triedy môžu obsahovať dynamické metódy, ktorých prítomnosť nie je pre externého vývojára zrejmá. Okrem toho sa počas prevádzky môžu vytvárať heterogénne polia objektov, ktoré môžu obsahovať rôzne metódy. Pre situácie, ako je táto, potrebujete nástroje na kontrolu existencie metódy v triede. Funkcia “method_exists()” je takým nástrojom v PHP.

Funkcia berie názov triedy alebo objektu ako prvý parameter a názov metódy ako druhý a vracia „true“, ak má objekt alebo trieda túto metódu, a v opačnom prípade „false“.

Ukážme si, ako funguje funkcia „method_exists()“ a vytvoríme triedu „myExists“, ktorá bude obsahovať dve metódy, verejnú a súkromnú.

Trieda myExists ( public function method_public() ( echo "Verejná metóda"; ) súkromná funkcia method_private() ( echo "Private method"; ) ) $_Class_myExists = new myExists(); if(method_exists($_Class_myExists, "method_public")) ( echo "

Metóda "method_public" existuje
"; ) if(method_exists($_Class_myExists, "method_private")) ( echo "
Metóda "method_private" existuje
"; ) if(method_exists($_Class_myExists, "method_protected")) ( echo "
Metóda "method_protected" existuje
";) inak (echo"
Metóda "method_protected" neexistuje
"; }

V príklade sa pomocou funkcie „method_exists()“ v objekte triedy „myExists“ kontroluje prítomnosť existujúcich metód „method_public()“, „method_private()“ a neexistujúcej metódy „method_protected()“. výsledok:

Metóda "method_public" existuje Metóda "method_private" existuje Metóda "method_protected" neexistuje

Ako vidno z výsledku testu, funkcia vráti hodnotu „true“ pre každú z metód, bez ohľadu na jej špecifikátor prístupu, „false“ sa vráti iba vtedy, ak objekt nemá privátnu alebo verejnú metódu s týmto názvom.

Prvý argument funkcie "method_exists()" je objekt triedy "$_Class_myExists", avšak na testovanie metódy nie je potrebné vytvárať objekt, stačí zadať názov triedy. Príklad:

Method_exists("myExists", "method_public");

Pri práci s funkciou „method_exists()“ nezabúdajte, že nedokáže určiť prítomnosť dynamických metód vytvorených pomocou špeciálnej metódy „__call()“, „__callStatic()“.

Okrem funkcie „method_exists()“ môžete použiť aj alternatívnu funkciu „is_callable()“, ktorá na rozdiel od „method_exists()“ okrem kontroly metódy triedy umožňuje skontrolovať existenciu funkcie, ktorá nie je súčasťou triedy.

Pri práci s triedou tretej strany vývojár často dôkladne nepozná všetky metódy tejto triedy. Ak chcete získať ich úplný zoznam, môžete použiť funkciu „get_class_methods()“. Funkcia berie názov triedy ako svoj prvý parameter a vracia pole svojich verejných metód. Je potrebné zdôrazniť, že táto funkcia nevracia súkromné ​​metódy. Príklad:

$_all_pulic_method = get_class_methods($_Class_myExists); ozvena"

"; print_r($_all_pulic_method); echo "
";

výsledok:

Pole ( => method_public)

Ako vidíte, súkromná metóda "method_private()" nie je zahrnutá vo výslednom poli. Dynamické metódy, ktoré sú emulované pomocou špeciálnej metódy "__call()", "__callStatic()" tiež nie sú zahrnuté v zozname získanom pomocou funkcie "get_class_methods()".


Inšpirované problémom, s ktorým som sa stretol v dôsledku nesprávneho použitia funkcie isset() v motore čínskeho internetového obchodu. Tam sa isset() použilo na určenie existencie prvku poľa s určitým kľúčom. Najnepríjemnejšie na tejto situácii je, že túto chybu robí veľa ľudí. Toto nie je prvýkrát, čo sa v tomto konkrétnom kontexte použila funkcia isset(), hoci je v podstate nesprávna. Tentoraz ma však negramotnosť vývojárov stála stratený čas, čo ma podnietilo napísať túto poznámku.

O to viac ma „potešili“ komentáre jedného „neznámeho“ známeho, ktorý bol prekvapený mojím rozhorčením. Ako sa ukázalo, počul niečo o existencii funkcie array_key_exists(), ale sám ju nikdy nepoužil. Navyše som niekde čítal, že je lepšie ho nahradiť isset() , pretože ten funguje rýchlejšie.

V skutočnosti sa o úrovni kvalifikácie PHP programátorov popísalo veľa a k tomu nie je čo dodať.

Inicializácia a vymazanie premennej v PHP

V PHP sa premenná inicializuje, keď je k nej priradená hodnota. Premenná sa považuje za neinicializovanú v dvoch prípadoch:

  • nebol mu priradený žiadny význam;
  • bola mu priradená hodnota typu NULL alebo odovzdaná funkcii unset().

Priradenie hodnoty NULL k hodnote odstráni premennú, podobne ako funkcia unset(), to znamená, že sa neinicializuje.

Ak sa pokúsite použiť premennú, ktorá bola odstránená pomocou unset() , vygeneruje sa chyba na úrovni E_NOTICE. Toto sa nestane s premennou nastavenou na NULL.

funkcia isset().

Funkcia skontroluje, či bola premenná inicializovaná. isset() vráti hodnotu false, ak jej zadáte neinicializovanú premennú ako parameter. To isté sa stane s kľúčom poľa, ktorý má hodnotu NULL. Pravidlá pre pretypovanie na NULL pre kľúče poľa sú rovnaké ako pre premenné.

$nullVar = null; var_dump($nullVar); $array = array("key_str" => "foo", "key_null" => null, "key_int" => 1); var_dump($pole);

výsledok:

nulový pole"key_str" => reťazec "foo" (dĺžka = 3)"key_null" => null "key_int" => int 1

funkcia array_key_exists().

Funkcia array_key_exists() funguje podobne ako isset() , ale jediný rozdiel je v tom, že aj pre kľúč s hodnotou NULL bude vrátená hodnota TRUE.

$array = array("key_str" => "foo", "key_null" => null, "key_int" => 1); var_dump(array_key_exists("key_null", $pole)); // Vráti boolean true

Na úplné odstránenie páru kľúč – hodnota musíte použiť unset() .

Pre pole je použitie hodnoty kľúča NULL vhodné, ak je potrebné zachovať prítomnosť kľúča. Bude možné počítať s kontextom, v ktorom bude tento kľúč použitý. Je to vhodné napríklad pri vypĺňaní polí formulára predvolenými hodnotami. Napríklad pri použití konštrukcie echo, NULL, sa hodnota prenesie do prázdneho reťazca.

To, na čo narážam, sa mi zdá zrejmé. Ak pracujete s kľúčmi poľa, použite presne tú funkciu, ktorá je na to určená. Navyše, použitie array_key_exists() vám umožňuje presne pochopiť aplikačnú logiku. Neexistujú žiadne nejasnosti.

Rýchlosť isset() a array_key_exists()

To, že array_key_exists() je pomalšie ako isset() je dokonca napísané v komentároch k príslušnej stránke PHP manuálu. Sťažnosť spočíva v tom, že pomalší výkon array_key_exists() je viditeľný na poliach s viac ako 200 pármi kľúč-hodnota.

Nezostáva nič iné, len spustiť banálny test:

$testArray = pole(883209 => 568420, 553314 => 266114, 133088 => 367615, // ...); $timerStart = mikrotime(); pre ($i = 0; $i

Asociatívne pole $testArray obsahuje 10 000 prvkov. To je o niečo viac, ako je uvedené 200 .

Ďalej spustíme cyklus s množstvom iterácie 100 000. V tele cyklu zas najprv skontrolujeme pomocou isset() , potom pomocou array_key_exists() . Kľúč, ktorého prítomnosť kontrolujeme, je generovaný náhodne, aby sa minimalizovala pravdepodobnosť jeho existencie v poli.

/>
isset() array_key_exists()
0.687027 0.728652

Test je samozrejme veľmi jednoduchý a dosť subjektívny. Bolo by fajn zmerať napríklad použitú pamäť. Ale pri pohľade na výsledky tohto testu nemám chuť pokračovať v myšlienke. Je zrejmé, že rýchlosť sa jednoducho nezvýši.

funkcie isset() a vlastnosti objektu

Nie tak často ako v prípade polí, ale je možné stretnúť sa s podobnými podmienkami:

Trieda Foo ( public $property = null; verejná funkcia __construct() ( ) ) $object = new Foo(); if (!isset($object->property)) ( echo "vlastnosť neexistuje"; )

Tento prípad je hrozný, pretože používanie NULL ako predvolenej hodnoty vlastností je veľmi bežnou praxou. A kontrola prítomnosti vlastnosti objektu pomocou isset() je jednoducho neprijateľná.

Na kontrolu existencie vlastnosti na objekte v PHP existuje funkcia property_exists() . Podobne ako array_key_exists() , property_exists() vráti TRUE, aj keď je vlastnosť nastavená na NULL.

Všimnite si tiež, že použitie property_exists() nevyžaduje objekt triedy. Kontrolu je možné vykonať podľa názvu triedy a názvu vlastnosti.

Trieda Foo ( public $property = null; verejná funkcia __construct() ( ) ) var_dump(property_exists("Foo", "vlastnosť")); // Vráti hodnotu true

Toto je také zábavné programovanie.

Sú chvíle, keď potrebujete skontrolovať, či zadaný súbor existuje alebo nie, napríklad, aby ste so súborom následne vykonali nejaké akcie.

S týmto problémom som sa stretol aj pri vývoji modulu. A našiel som dve možnosti riešenia problému.

Kontrola existencie súboru pomocou odkazu URL

V PHP existuje funkcia " fopen“, ktorý možno použiť na otvorenie zadanej adresy URL.

Čo robíme? Pokúsime sa otvoriť súbor a ak sa nám to podarí, súbor existuje, inak súbor neexistuje.

Implementácia:

Ale čo ak nemáme jeden súbor, ale niekoľko, takpovediac, pole odkazov? Presne táto úloha stála predo mnou od samého začiatku. A riešenie tohto problému je nasledovné:

V tomto prípade dostaneme zoznam iba tých súborov, ktoré existujú.

Kontrola existencie lokálneho súboru

Slovo „lokálne“ znamená, že skript a súbory na overenie sú umiestnené na rovnakom serveri. Ak máte pomerne veľké množstvo odkazov, táto možnosť je najlepšia na vyriešenie problému, pretože nepodávame požiadavku na server tretej strany, ale skenujeme zadané adresáre.

Táto metóda používa funkciu „file_exists“ a analogicky s predchádzajúcou možnosťou jednoducho nahradí časť skriptu:

A to isté pre pole odkazov:

Čo to stojí za to Poznámka? Skutočnosť, že táto metóda je vhodná na spúšťanie súborov umiestnených v našom súborovom systéme. Preto je vhodné označiť všetky odkazy ako relatívne.

Mimochodom, pri jednej z objednávok som práve touto metódou dokázal naskenovať asi 135 000 súborov za pár sekúnd.