Tipy na PHP
Tipy na PHP z jednoho mrtvého 414 bloguMů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.archive.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\projekty\workplace\fakturaHtml\testpublic.php on line 7
Call Stack
# Function Location
1 {main}() D:\www\projekty\workplace\fakturaHtml\testpublic.php:0
2 foo() D:\www\projekty\workplace\fakturaHtml\testpublic.php:10
3 jinaFoo() D:\www\projekty\workplace\fakturaHtml\testpublic.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

Error414 |
24.11.2011 |