Tipy na PHP

autor Error414 | cal 24.11.2011 | mrtvý blog m4rtin mrtvý blog |

Tipy na PHP z jednoho mrtvého 414 blogu


xdebug var_dump, instace operačního systému, chyba kód10 windous 10, blat priklad, xdebug_call_line, blat y, www libertin cz výsledky php typ, příklad scriptu blat, badao com s jgtetd, wedos recenze,

Můj vývoj podmínek v return
Publikováno 25. 11. 2007

1. Uplný začátek

function foo($a = 1, $b = 2){
if($a == $b){
return true;
}else{
return false;
}
}

2. už jsem lepší

function foo($a = 1, $b = 2){
if($a == $b){
return true;
}

return false;
}

3. poznal jsem ternární operátor

function foo($a = 1, $b = 2){
return $a == $b ? true : false;
}

4. opustil jsem ternární operátor

function foo($a = 1, $b = 2){
return $a == $b;
}

17 komentářů

    peCan @ 25. 11. 2007

    Pěkné a jednoduché. Dík za tip.
    error414 @ 25. 11. 2007

    [1] takze prechazis na bod 4? :D
    paranoiq @ 26. 11. 2007

    hezké a triviální, ale situace je většinou složitější, než aby stačila čtyřka.

    a občas je třeba taky obráceně:

    function foo($x) {
    …
    if(!$y) return false;
    if(!$z) return false;
    if(!$v) return false;
    if(!$w) return false;

    return true;
    }
    error414 @ 26. 11. 2007

    [3]

    function foo2($y, $z, $v) {
    return !(!$y or !$z or !$v);
    }

    neslo by treba tohle?
    error414 @ 26. 11. 2007

    ivan_d me doplnil

    function foo3($y, $z, $v) {
    return $y and $z and $v;
    }
    paranoiq @ 27. 11. 2007

    jistě že by to šlo. zjednodušujete zjednodušený příklad :)

    viz třeba tohle:

    function foo($x) {
    …
    if(!y($x)) return false;
    if(!z($x)) return false;
    if(!v($x)) return false;
    if(!w($x)) return false;

    return true;
    }

    jednak ušetříme čas a dál by třeba funkce z mohla rovnou zkolabovat na výsledku, který není podle funkce y validní atd..
    error414 @ 27. 11. 2007

    neusetrime cas protoze zapis

    return $y® and $z® and $v®;

    je stejne rychly jako

    if(!y®) return false;
    if(!z®) return false;
    if(!v®) return false;

    oba dva priklady se ukonci pri vraceni false funkci ‚y‘.

    napriklad mame funkce
    function foo1($p){
    var_dump(‚foo1‘);
    return $p;
    }

    function foo2($p){
    var_dump(‚foo2‘);
    return $p;
    }

    a ted prvni bude vracet false
    if(foo1(false) and foo2(true)){
    }
    // vypise se jen ‚foo1‘

    pokud bude prvni vracet true
    if(foo1(true) and foo2(true)){
    }
    // vypise se ‚foo1‘ a ‚foo2‘

    BTW: muzem si tykat ne?
    Jakub Podhorský @ 28. 11. 2007

    ke čtvrtýmu způsobu mám děsnou averzi :) protože profesor kterej nás učí C++ jí po nás vyžaduje a já mám tak rád variantu dvě :)
    Kcko @ 2. 12. 2007

    Pouzivam 1+2+3 a to podle situace. Podle me uz pripad 4 hranici s citelnosti … navic kdyz projekt dela vic lidi.

    Myslim si ze dulezitejsi je citelnost a prehlednost nez usetrit par radku kodu …
    finc @ 2. 12. 2007

    to Kcko: A co je necitelne na poslednim zpusobu?
    Je to podobne jako s ternarnim operatorem. Sice ne vzdy je neco takoveho pouzitelne a prehledne, ale presto ma sve misto.

    Kdyz porovnavate dve hodnoty v if(), tak prece jedinym vysledem je boolean hodnota.

    Osobne znam jediny duvod, pri kterem je neco takoveho nepouzitelne a to je pri vyhazovani vyjimky. V kazdem dalsim pripade je to jasna cesta. Proc neco obalovat if podminkou, kdyz vysledek je stejny?
    paranoiq @ 3. 12. 2007

    tak ty si s tím zjednodušováním nedáš pokoj.. :)

    takhle už je snad dostatečně zřejmé, co mám na mysli,

    function foo($x) {
    …
    if(!y($x)) return false;
    …
    if(!z($x)) return false;
    …
    if(!v($x)) return false;
    …
    if(!w($x)) return false;
    …
    return true;
    }

    .. když říkám, že to nemusí být tak jednoduché..
    error414 @ 3. 12. 2007

    joo takto, tak ted uz vim. vidis ze sme se dostali ke zdarnemu konci
    v6ak @ 16. 12. 2007

    „Osobne znam jediny duvod, pri kterem je neco takoveho nepouzitelne a to je pri vyhazovani vyjimky.“
    Tomu nerozumím. Jakto?
    ~ @ 23. 12. 2007

    lol, toto ma byt php-pro blog? Asi tezko, kdyz autor nepopsal ani jeden design pattern, zrejme zadny nezna a tak se zabyva podminkami if ,,, else a pise o sobe, ze je php-pro, pritom si ani neumi napsat kvalitni weblog, radeji tupe klika ve wordpressu, ktery je po strance zdrojovych kodu primo odporny.

    PS: email nikdy nesmi byt required pro zanechani komentare
    error414 @ 23. 12. 2007

    to ~: http://web.ar­chive.org/web/*/http­://error414.com a pak sud.

    BTW: je krasne jak nekdo dokaze v jednom komentari ze sebe udelat vola.
    xxxmerlin @ 27. 12. 2007

    Elegantní finta. Děkuji.
    ovecka @ 29. 12. 2007

    prosim te jak mam zmensit fotku jako abych ji mohla dat na spoluzaky jako z 65MB na 512KB me to porad nejde prosim porad napis na email!!!Predem dik

Porovnávací hádanka
Publikováno 20. 11. 2007

Zahrajeme si na malou doplňovačku. Doplňte místo XXX hodnoty tak aby platilo.

$a = XXX;
$b = XXX;
$c = XXX;

var_dump($a == $b); // boolean true
var_dump($a == $c); // boolean true
var_dump($b == $c); // boolean false

Hodne stěstí. Ted budu moderovat komentáře aby si mohli zahádat i ostatní.
7 komentářů

    R! @ 20. 11. 2007

    Vidim ze ses vubec nezmenil :-).Kazdopadne vitej back a abych nebyl OT
    $a = false;
    $b = array();
    $c = 0;

    ADMIN: po soutezi zverejnim cele
    admin @ 20. 11. 2007

    Ha, tak tahle moznost me nenapadla. Ale taky to vychazi. Nezmenil jsem se, porad miluju PHP.
    Jakub Vrána @ 20. 11. 2007

    Kupříkladu 1, „1“, „1b“.
    admin @ 20. 11. 2007

    tak uz dve rozdilne odpovedi a to mam jeste v zaloze tu svou. takze zatim jsou uz tri odpovedi.
    paranoiq @ 20. 11. 2007

    tak třeba 0, ‚0‘, ''
    mixpulin @ 20. 11. 2007

    $a = ‚0.0‘;
    $b = 0;
    $c = true;
    Non_E @ 20. 11. 2007

    $a = 0;
    $b = „0“;
    $c = null;

Porovnáváme třídy
#274 | Rubrika: internet

Porovnávací operatory v php asi kazdý zna == === :-). Málokdoje ale používá na porovnávání neskalárních prvků PHP. Porovnat se dají napřiklad instance tříd. Nejazajímavější je pokud porovnáme instance stejneho typu. Vytvoříme si testovací třídu A.

class A {
    public $ja = ?jsem trida A?;
}

Vytvoríme zní několik instancí.

$a = new A();
$b = new A();
$c = $a;

Začneme provnávat.

var_dump($a === $b); // false
var_dump($a == $b ); // true

var_dump($a === $c); // true
var_dump($a == $c);  // true

var_dump($b === $c); // false
var_dump($b == $c);  // true

Takže == se budou rovnat jen instace které jsou stejného typu. Operátorem === se zase budou rovnat identické instance, jinak řečeno že se instance rovná sama sobě.

Zvrat o 56 stupnů se koná pokud zapíšeme do proměné $ja. $b->ja = „error414“;

var_dump($a === $b); // false
var_dump($a == $b ); // false

var_dump($a === $c); // true
var_dump($a == $c);  // true

var_dump($b === $c); // false
var_dump($b == $c);  // false

Jsme v kocích protože předchozí tvrzení neplatí. Musíme ho doplnit. Operator == vyhodnotí jako true instance stejneho typu které mají v nitřní hodnoty shodné.

A to je vše, přátelé.

Michaels přidal odkaz na manuálovou stránku. http://cz.php­.net/…mparison­.php

PHP dědičnost a konstanta
#273 | Rubrika: internet

Narazil jsem na další zajímavý problém v PHP. Představme si že mám třídu typu A, která obsahuje metodu. Ta metoda potřebuje ke svému běhu constantu kterou defunijí potomci třídy A. Třída A je abstraktní.

<?
class A{
  function test(){
    //tady se potrebuju ke konstantam dostat

  }
}

class B extends A{
  const KONSTANTA = 1;
}

class C extends A{
  const KONSTANTA = 2;
}

$class = new B;
$class->test();

Byl jsem nakopnut směrem k eval. Bohužel není možno volat funkci test staticky. Poslední dobou jsem nucen používat funkci eval čímdál častěji.

<?
class A{
  function test(){
    //tady se potrebuju ke konstantam dostat
    echo eval('return  '.get_class($this).'::KONSTANTA;');
  }
}

Jedna ze záludností PHP
#272 | Rubrika: internet

Todleto jsem už několikrát viděl v nějakém kódu. Sám jsem tuto chybu dělával. Teď když se na to dívám s odstupem času, říkám si že neco tak jasného se přece musí vědět hned od začátku. A ono člověče ne.

Tak takový malý kvíz. V tomhle kódu je ta hrubá chyba, kterou nevědomky dělají ti co o ní nevědí. Kdo tu chybu zná nechť zastaví svoje nutkání a nechá neosvícé trápit si hlavičku.

Kód

<?php
$forWrite = NULL;
$filename = 'soubor.txt';
$klukove  = array('Petr' , 'Pavel', 'Standa', 'Franta');
$divky    = array('Marie', 'Lenka', 'Aneta' , 'Zlatka');

foreach($klukove as $key => $kluk){
  $forWrite .= "Dnes ".date('m. d. Y')." ".$kluk." a jeho holka ".$divky[$key]." meli rande \n"; // sou to unixi
}

// upraveno 6.11.2007
if (!$fp = fopen('$filename', 'w')){
    die ("Cannot open file ($filename)");
}

if (fwrite($fp, $forWrite) === FALSE) {
    die ("Cannot write to file ($filename)");
}
?>

Výstup

Dnes 01. 03. 2007 Petr a jeho holka Marie meli rande
Dnes 01. 03. 2007 Pavel a jeho holka Lenka meli rande
Dnes 01. 03. 2007 Standa a jeho holka Aneta meli rande
Dnes 01. 03. 2007 Franta a jeho holka Zlatka meli rande

Nastavte se v jedné lajně
#271 | Rubrika: o_vsem

V Davidových ukázkách použití jeho tříd mě zaujala jedna konstrukce. Pro nastavování instance můžeme použít.

$osoba->jmeno('Petr')->prijmeni('cada')->vek('22');

Řešení je tak jednoduché, že si říkám že jsem na to nepřišel sám. Fígl je vtom že settery (přístupové metody třídy) vrací instanci ke které setter přísluší.

class osoba{
    public $jmeno, $prijmeni, $vek;

    public function jmeno($jmeno){
        $this->jmeno = $jmeno;
        return $this;
    }

    public function prijmeni($prijmeni){
        $this->prijmeni = $prijmeni;
        return $this;
    }

    public function vek($vek){
        $this->vek = $vek;
        return $this;
    }
}

$osoba = new osoba();
$osoba->jmeno('Petr')->prijmeni('cada')->vek('22');

object(osoba)#1 (3) {
  ["jmeno"]=>
  string(4) "Petr"
  ["prijmeni"]=>
  string(4) "cada"
  ["vek"]=>
  string(2) "22"
}

BTW: Píšu to pro ty co o tom neví, ne pro rejpaly co si masírují ego.

PHP funkční pomůcka
#268 | Rubrika: internet

Nejjednodušší cesta jak zjisti jestli váš hosting podporuje tu či onu funkci je vyzkoušet to. Ti co sou už dostatečně vyzrálými programátory (?jsou líní jak veš?) si udělají malou pomůcku, která vypíše všechny funkce podporované hostingem.

<?php

$functions  = get_defined_functions();
sort($functions['internal']);
foreach ($functions['internal'] as $key => $value){
    echo '<a href="http://www.php.net/' . $value . '">' . $value . '</a> <br>';
}
?>

Xdebug, Profiler pro PHP
#263 | Rubrika: internet
Update: už je i verze 2, která ukazuje i paměť. Zatím to nemám plne prozkoumané ale určite to nezahodím.

Dlouhé čekaní, čekakáme dál. Také vás to tak baví čekat jen proto že programator webové aplikace byl prasátko (někdy je pomalý server). Například příklad z nejmenované stránky
Vygenerováno za 3,66971 sekund ~ Počet SQL dotazů: 4, tohle je opravdu hoodně zlé.

PHP je už od přírody pomalé, jako důchodce co se před váma vleče zrovna když spěcháte. Zrychlení se dočkáme pouze tehdy, když dáme před důchodce zavírající spoj MHD.

Nebudu zde popisovat techniky jak zrychlit PHP aplikaci, ale jak zjistit co nám aplikaci spomaluje.

Nejlepší program na profilování (zjišťování rychlosti) PHP scriptu jsem našel Xdebug. Je to vlastně modul pro PHP. Mimo jiné xdebug mení i chybové hlašení PHP. Přidává do něho trasování chyby. Což je vlastně cesta kudy chyba vyplavala.
Fatal error: Call to undefined function neznama() in D:\www\projek­ty\workplace\fak­turaHtml\testpu­blic.php on line 7
Call Stack
#     Function     Loca­tion
1     {main}()     D:\www\­projekty\workpla­ce\fakturaHtml\tes­tpublic.php:0
2     foo()     D:\www\pro­jekty\workpla­ce\fakturaHtml\tes­tpublic.php:10
3     jinaFoo()     D:\www\pro­jekty\workpla­ce\fakturaHtml\tes­tpublic.php:3

Nastavení
Pokud je modul načtený (to zvládnete) stačí jen zapnout automatický start profileru. Jsou na to zabudované funkce, které se mohou spoustět uvnitř scriptu, ale ty mi nefungují.

PHP.INI
#zapnuti profileru
xdebug.auto_profile = 1

#automaticke spusteni profileru pri vykonavani scriptu
xdebug.profiler_enable = 1

#vystupni aresar kam se uklada soubor, ktery nese informace o profilovani
xdebug.profiler_output_dir = C:\vystupniAdresar

Xdebug profiler vygeneruje specialni soubor *cachegrind.out.512*, kde 512 je PID apache.

Přečíst tento soubor umí WinCacheGrind a na linuxu KCacheGrind. KCacheGrind je o něco lepší. Wincachegrind


Kometáře

Zatim tu nejsou žádný (schválené) kometáře.
Nové kometáře nejsou povolené.

Související články

300 bitva u thermopil cz online ztráta identity na internetu ani cerna ip adresa badoo nový firefox cz aplikace do mobilu badoo air soft tank levně dárky k vánocům pro teenagery internet oskar technická podpora badoo