Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

PHP Tips & Tricks

16,156 views

Published on

Tips and tricks about PHP - some rechniques, not well known functions etc.

Published in: Technology
  • Be the first to comment

PHP Tips & Tricks

  1. 1. PHP TIPS & TRICKS 1
  2. 2. PHP TIPS & TRICKS AKAJOURNEY INTO DEPTHS OF MANUAL 2
  3. 3. name: Radosław Benkel nick: singles www: http://www.rbenkel.me twitter: @singlespl ** and I have nothing in common with http://www.singles.pl ;] 3
  4. 4. DEVELOPERS OFFEN WRITE FUNCTIONS FORSOMETHING, THAT ALREADY EXISTS. 4
  5. 5. WHY? 5
  6. 6. WHY?SOMETIMES THEY WANT TO DO SOMETHING BETTER. 6
  7. 7. WHY?SOMETIMES THEY WANT TO DO SOMETHING BETTER.OR JUST DONT KNOW THAT SOMETHING ALREADY EXISTS. 7
  8. 8. SOME OF THESE YOU MAY KNOW. 8
  9. 9. SOME OF THESE YOU MAY KNOW. SOME DONT. 9
  10. 10. SOME OF THESE YOU MAY KNOW. SOME DONT. IF YOU KNOW BETTERSOLUTION, PLEASE SHARE :) 10
  11. 11. SHORT TERNARY OPERATOR 11
  12. 12. SHORT TERNARY OPERATOR$var = SomeValue;$output = $var ? $var : default;$output = $var ?: default; //PHP >= 5.3 12
  13. 13. DIRECTORY LISTING 13
  14. 14. DIRECTORY LISTING #1$dir = "/application/modules/*";if (is_dir($dir)) { if ($dh = opendir($dir)) { while (($file = readdir($dh)) !== false) { echo "Filename is: " . $file . PHP_EOL; } closedir($dh); }} 14
  15. 15. DIRECTORY LISTING #2$dir = "/application/modules/*";foreach(glob($dir) as $file) { echo "Filename is: " . $file . PHP_EOL;} 15
  16. 16. DIRECTORY LISTING #3$dir = "/application/modules/";foreach (new DirectoryIterator($dir) as $fileInfo) { echo "Filename is: " . $fileInfo->getFilename() . PHP_EOL;} 16
  17. 17. DIRECTORY LISTING #3$dir = "/application/modules/";foreach (new DirectoryIterator($dir) as $fileInfo) { echo "Filename is: " . $fileInfo->getFilename() . PHP_EOL;} andlotofothers: http://www.php.net/manual/en/ class.directoryiterator.php 17
  18. 18. EXPLODED STRING VALUES 18
  19. 19. EXPLODED STRING VALUES$string = bazinga.foo.bar.suitup!$values = explode(., $string);$sheldon = $values[0]; //bazinga$barney = $values[3]: //suituplist($sheldon, , , $barney) = explode(., $string);//PHP 5.4 stuff$sheldon = explode(., $string)[0];$barney = explode(., $string)[3]; 19
  20. 20. FILEPATH INFORMATION 20
  21. 21. FILEPATH INFORMATION$path = /some/directory/in/filesystem/file.some.txt;$parts = explode(/, $path);$partsCopy = $parts;array_pop($partsCopy);// /some/directory/in/filesystem$filePath = implode(/, $partsCopy);$fileExtension = explode(., $parts[count($parts) - 1]);// txt$fileExtension = $fileExtension[count($fileExtension)-1]; 21
  22. 22. FILEPATH INFORMATION Butwhy? 22
  23. 23. FILEPATH INFORMATION$path = /some/directory/in/filesystem/file.some.txt;$fileInfo = pathinfo($path);$fileInfo[dirname] === pathinfo($path, PATHINFO_DIRNAME);$fileinfo[basename] === pathinfo($path, PATHINFO_BASENAME);$fileinfo[extension] === pathinfo($path, PATHINFO_EXTENSION);$fileinfo[filename] === pathinfo($path, PATHINFO_FILENAME); 23
  24. 24. FIRST NOT EMPTY VARIABLE 24
  25. 25. FIRST NOT EMPTY VARIABLE AKA COALESCE, NVL 25
  26. 26. FIRST NOT EMPTY VARIABLE$a = null;$b = false;$c = 14;$d = foo;$notEmpty = $a ?: $b ?: $c ?: $d;echo $notEmpty // 14 26
  27. 27. DEEP VAR INTERPOLATION 27
  28. 28. DEEP VAR INTERPOLATION$obj = new stdClass();$obj-some = hello;$obj-foo = new stdClass();$obj-foo-bar = 123;echo Value is $obj-some;//Object of class stdClass could not be converted to string inecho Value is $obj-foo-bar;//Value is 123echo Value is {$obj-foo-bar};//Same for array$ar = array(some = var);echo Value is $ar[some]; //syntax errorecho Value is {$ar[some]}; //Value is var 28
  29. 29. MULTIPLE ISSET 29
  30. 30. MULTIPLE ISSET$val = null;$var = true;if (isset($not_defined) isset($val) isset($var)) { /* ... */} 30
  31. 31. MULTIPLE ISSETif (isset($not_defined) isset($val) isset($var)) { /* ... */} ===if (isset($not_defined, $val, $var)) { /* ... */} 31
  32. 32. FILTER_INPUT 32
  33. 33. FILTER_INPUT$action = isset($_POST[action]) ? some_validate($_POST[action]) : default_action; 33
  34. 34. FILTER_INPUT 34
  35. 35. FILTER_INPUT/* data actually came from POST$_POST = array( product_id = libgdscript, component = 10, versions = 2.0.33, testscalar = array(2, 23, 10, 12), testarray = 2,);*/$args = array( product_id = FILTER_SANITIZE_ENCODED, component = array( filter = FILTER_VALIDATE_INT, flags = FILTER_REQUIRE_ARRAY, options = array(min_range = 1, max_range = 10) ), versions = FILTER_SANITIZE_ENCODED, doesnotexist = FILTER_VALIDATE_INT, testscalar = array( filter = FILTER_VALIDATE_INT, flags = FILTER_REQUIRE_SCALAR, ), testarray = array( filter = FILTER_VALIDATE_INT, flags = FILTER_REQUIRE_ARRAY, ));$myinputs = filter_input_array(INPUT_POST, $args); 35
  36. 36. STRING CONCATENATION 36
  37. 37. STRING CONCATENATION TIME F OR R IDDLE! 37
  38. 38. STRING CONCATENATION WHO K NOWS W HATS T HAT? 38
  39. 39. STRING CONCATENATION WHO K NOWS W HATS T HAT? 39
  40. 40. STRING CONCATENATION CORRECT! 40
  41. 41. STRING CONCATENATION 41
  42. 42. STRING CONCATENATION$a = scissors;$b = paper;$c = rock;$d = lizard;$e = Spock;$rules = $a . cut . $b . , . $b . covers .$c . , . $c . crushes . $d . , . $d . poisons . $e . ...;echo $rules;//scissors cut paper, paper covers rock, rock crusheslizard, lizard poisons Spock... 42
  43. 43. STRING CONCATENATION$a = scissors;$b = paper;$c = rock;$d = lizard;$e = Spock;$rules = $a cut $b, $b covers $c, $c crushes $d, $dpoisons $e...;echo $rules;//scissors cut paper, paper covers rock, rock crusheslizard, lizard poisons Spock... 43
  44. 44. STRING CONCATENATION$a = scissors;$b = paper;$c = rock;$d = lizard;$e = Spock;$rules = %s cut %s, %s covers %s, %s crushes %s, %s poisons %s...;echo sprintf($rules, $a, $b, $b, $c, $c, $d, $d, $e);echo vsprintf($rules, array($a, $b, $b, $c, $c, $d, $d, $e));printf($rules, $a, $b, $b, $c, $c, $d, $d, $e);vprintf($rules, array($a, $b, $b, $c, $c, $d, $d, $e));//4x scissors cut paper, paper covers rock, rock crushes lizard, lizardpoisons Spock... 44
  45. 45. STRING CONCATENATION WHY U SE P RINTF FAMILY F UNCTIONS,WHEN W E H AVE S TRING INTERPOLATION? 45
  46. 46. STRING CONCATENATION STRING PATTERN REUSE(CONNECTION STRINGS, API CALLS, ETC.) 46
  47. 47. STRING CONCATENATION LOT OF FORMATTING OPTIONS 47
  48. 48. QUICK OBJECT DEFINITION 48
  49. 49. QUICK OBJECT DEFINITION$obj = new stdClass();$obj-foo = 123;$obj-bar = some;//or (btw. not recursive!)$obj = (object)array(foo = 123, bar = some);// unfortunately - not possible :($obj = {foo = 123} 49
  50. 50. ENUM 50
  51. 51. ENUMclass Roles { const ADMIN = 1; const USER = 2; const GUEST = 3;}$class = new ReflectionClass(Roles);var_dump($class-getConstants());/*array(3) { [ADMIN]= int(1) [USER]= int(2) [GUEST]= int(3)}*/ 51
  52. 52. SPL FTW! 52
  53. 53. DATE/TIME MANIPULATION 53
  54. 54. DATE/TIME MANIPULATION 54
  55. 55. DATE/TIME MANIPULATION+ OBJECT/PROCEDURAL+ TIMEZONES+ INTERVALS+ SOME OPERATORS+ PHP CORE SINCE 5.2 55
  56. 56. DATE/TIME MANIPULATION$a = new DateTime(2011-12-12);$b = new DateTime(2011-11-12);$c = new DateTime(2011-12-12);var_dump(($a $b)); // falsevar_dump(($a $b)); // truevar_dump(($c == $a)); // true// works$a-add(new DateInterval(P2D));echo $a-format(Y-m-d) // echo 2011-12-14// dont work :($a += new DateInterval(P2D); 56
  57. 57. DID YOU MEAN ... 57
  58. 58. DID YOU MEAN ... 58
  59. 59. DID YOU MEAN ... YOU CAN TRY:http://php.net/manual/en/function.levenshtein.php 59
  60. 60. PARSING URL PARAMS 60
  61. 61. PARSING URL PARAMSparse_url + parse_str 61
  62. 62. PARSING URL PARAMS parse_url$url = http://username:password@hostname/path?arg=value#anchor;print_r(parse_url($url));echo parse_url($url, PHP_URL_PATH); //and others, same as pathinfo/*Array( [scheme] = http [host] = hostname [user] = username [pass] = password [path] = /path [query] = arg=value [fragment] = anchor)/path*/ 62
  63. 63. PARSING URL PARAMS parse_strparse_str(single=Singlecheck[]=check1check[]=fooradio=radio2, $data);print_r($data);die();/*Array( [single] = Single [check] = Array ( [0] = check1 [1] = foo ) [radio] = radio2)*/ 63
  64. 64. PARSING URL PARAMS parse_strparse_str(single=Singlecheck[]=check1check[]=fooradio=radio2, $data);print_r($data);die();/*Array( [single] = Single [check] = Array ( [0] = check1 [1] = foo ) DOntusewithoutsecondparameter! [radio] = radio2)*/ 64
  65. 65. PARSING URL PARAMS parse_strfunction foo() { parse_str(single=Singlecheck[]=check1check[]=fooradio=radio2); print_r(get_defined_vars());die();}foo(); Localmagicvariables! 65
  66. 66. CSV PARSING 66
  67. 67. CSV PARSINGfgetcsv + str_getcsv 67
  68. 68. CSV PARSING fgetcsv (for big files)$row = 1;if (($handle = fopen(test.csv, r)) !== FALSE) { while (($data = fgetcsv($handle, 1000, ,)) !== FALSE) { $num = count($data); echo p $num fields in line $row: br //pn; $row++; for ($c=0; $c $num; $c++) { echo $data[$c] . br /n; } } fclose($handle);}? 68
  69. 69. CSV PARSINGstr_getcsv (for smaller ones)$line = AddDescription My description to the file.filename.jpg;$parsed = str_getcsv( $line, # Input line , # Delimiter , # Enclosure # Escape char);var_dump( $parsed ); 69
  70. 70. AUTO_PREPEND_FILE 70
  71. 71. AUTO_PREPEND_FILE php.iniauto_prepend_file stringSpecifies the name of a file that is automatically parsed before themain file. The file is included as if it was called with therequire()function, so include_path is used.The special value none disables auto-prepending. 71
  72. 72. AUTO_PREPEND_FILE php.iniauto_prepend_file stringSpecifies the name of a file that is automatically parsed before themain file. The file is included as if it was called with therequire()function, so include_path is used.The special value none disables auto-prepending. Greatplaceforyourawesomemydie,dump, debug,pukeetc.functions. Butbecarefulwhendeploying. 72
  73. 73. FILE INCLUDE 73
  74. 74. FILE INCLUDE//config.php$dbName = some;$dbPass = foo;$dpPort = 123;//index.phpinclude config.php;echo $dbPass; //echo some 74
  75. 75. FILE INCLUDE//config.php$dbName = some;$dbPass = foo;$dpPort = 123; magicvariable! Local//index.phpinclude config.php;echo $dbPass; //echo some 75
  76. 76. FILE INCLUDE//config.phpreturn array( dbName = some, dbPass = foo, dbPort = 123);//index.php$config = include config.php;echo $dbPass; //Notice undefinedecho $config[dbName] = some; 76
  77. 77. FILE INCLUDE BTW. T HIS A LSO W ORKS//function.phpreturn function($data) { print_r($data);die();};//index.php$dump = include function.php;$dump(array(hello, moto)); 77
  78. 78. QUICK COMMENT WITHOUT IDE 78
  79. 79. QUICK COMMENTfunction foo() { $items = array(); foreach (array(some, a) as $item) { if ($item === a) { continue; } $items[] = $item; } return $items;} 79
  80. 80. QUICK COMMENTfunction foo() { $items = array(); /* foreach (array(some, a) as $item) { if ($item === a) { continue; } $items[] = $item; } */ return $items;} 80
  81. 81. QUICK COMMENTfunction foo() { $items = array(); /* */ foreach (array(some, a) as $item) { if ($item === a) { continue; } $items[] = $item; } /* */ return $items;} 81
  82. 82. QUICK COMMENTfunction foo() { $items = array(); /* * foreach (array(some, a) as $item) { if ($item === a) { continue; } $items[] = $item; } /* */ return $items;} 82
  83. 83. QUICK COMMENTfunction foo() { $items = array(); /* * foreach (array(some, a) as $item) { if ($item === a) { Anotheroptionsalsopossible continue; } $items[] = $item; } /* */ return $items;} 83
  84. 84. ONE LINE VARIABLE SWAP 84
  85. 85. ONE LINE VARIABLE SWAP$a = 123;$b = 987;list($a, $b) = array($b, $a);echo $a; //987echo $b; //123//or$a ^= $b ^= $a ^= $b;//http://betterexplained.com/articles/swap-two-variables-using-xor/ 85
  86. 86. COMPACT + EXTRACT 86
  87. 87. COMPACT + EXTRACTfunction index() { $user = Users::find(1); $items = Items::getAllForUser($user); return $this-render(index.twig, array( user = $user, items = $items )); //same as return $this-render(index.twig, compact(user, items));} 87
  88. 88. COMPACT + EXTRACTfunction foo() { $data = array(some = asa, foo = asda); extract($data); var_dump(get_defined_vars());die();}foo(); 88
  89. 89. COMPACT + EXTRACTfunction foo() { $data = array(some = asa, foo = asda); extract($data); var_dump(get_defined_vars());die();}foo(); Onceagainlocalmagicvariables! 89
  90. 90. FIRST ARRAY ELEMENT WITH ASSOCIATIVE KEYS 90
  91. 91. FIRST ARRAY ELEMENT$data = array( foo = 123, bar = 1987, wee = ugh);//echo $data[0]; //undefined offsetecho reset($data); //123echo current($data); //123reset($data);list(,$value) = each($data);echo $value; //123list($value) = array_values($data);echo $value; //123echo array_shift($data); //123 - caution - modifies array//solution?echo array_shift(array_values($data)); //123 without modifying array 91
  92. 92. RANDOM ARRAY ITEM 92
  93. 93. RANDOM ARRAY ITEM$data = array( foo = 123, bar = 1987, wee = ugh);// not like that - works only for number indexed arrayswithout gaps !$random = $data[rand(0, count($data) - 1)];// or that way - array_rand returns key, not value!$random = array_rand($data);// that way - works always$random = $data[array_rand($data)]; 93
  94. 94. MULTIPLE VALUE CHECK 94
  95. 95. MULTIPLE VALUE CHECK$person = Barney;if ($person == Joey || $person == Rachel || $person == Ross || $person == Phoebe || $person == Monica || $person == Chandler) { echo Best comedy show ever;} else if ($person == Barney || $person == Ted || $person == Lily || $person == Marshal || $person == Robin) { echo Copy of best comedy show ever, but still good one;} else { echo Maybe another good show;} 95
  96. 96. MULTIPLE VALUE CHECK$person = Barney;switch ($person) { case Joey: case Rachel: case Ross: /* ... */ echo Best comedy show ever; break; case Barney; case Ted; /* ... */ echo Like a copy of best show ever, but still good one; break; default: echo Maybe another good show;} 96
  97. 97. MULTIPLE VALUE CHECK$person = Barney;if (in_array($person, array(Joey, Rachel, Ross, Phoebe, Monica,Chandler)))) { echo Best comedy show ever;} else if (in_array($person, array(Barney, Ted, Lily, Marshal,Robin)))) { echo Like a copy of best comedy show ever, but still good one;} else { echo Maybe another good show;} 97
  98. 98. MULTIPLE VALUE CHECK BTW!in_array($needle, $haystack) works like ==in_array($needle, $haystack, true) works like === 98
  99. 99. EMPTY ARRAY CHECK 99
  100. 100. EMPTY ARRAY CHECK$input = array();//it will workif (is_array($input) count($input) === 0) {}//via @wookiebplif ($input === array()) {} 100
  101. 101. EMPTY ARRAY CHECK//why not ==?if ($input == array()) {} 101
  102. 102. EMPTY ARRAY CHECKhttp://php.net/manual/en/types.comparisons.php 102
  103. 103. INNER ARRAYS OPERATIONS 103
  104. 104. INNER ARRAYS OPERATIONS$shopCartPrices = array( 1 = 123.12, 4 = 23.34, 6 = 99.23);//sum? basic stuff.$sum = array_sum($shopCartPrices); 104
  105. 105. INNER ARRAYS OPERATIONS BUT SOMETIMES... 105
  106. 106. INNER ARRAYS OPERATIONS 106
  107. 107. INNER ARRAYS OPERATIONS 107
  108. 108. INNER ARRAYS OPERATIONS$shopCartPrices = array( 1 = array( price = 123.12 ), 4 = array( price = 23.34 ), 6 = array( price = 99.23 ));//sure. you can do that$sum = 0;foreach ($shopCartPrices as $cartItem) { $sum += $cartItem[price];} 108
  109. 109. INNER ARRAYS OPERATIONS$shopCartPrices = array( 1 = array( price = 123.12 ), 4 = array( price = 23.34 ), 6 = array( price = 99.23 ));//but you can do better = PHP = 5.3$sum = array_sum(array_map(function($cartItem) { return $cartItem[price];}, $shopCartPrices)); 109
  110. 110. INNER ARRAYS OPERATIONS BUT W ITH T HIS O NE, P EOPLE OFTEN L OOK A T M E L IKE SOMEONE W HOS U SING M AGIC. 110
  111. 111. INNER ARRAYS OPERATIONS OR F ORCE 111
  112. 112. INNER ARRAYS OPERATIONS$shopCartPrices = array( 1 = array( price = 123.12 ), 4 = array( price = 23.34 ), 6 = array( price = 99.23 ));//and sometimes, even better - without PHP 5.3$sum = array_sum(array_map(array_pop, $shopCartPrices)); 112
  113. 113. LAST R IDDLE 113
  114. 114. $var = a;for($i = 0; $i 150; $i++) { $var++; echo $var, ;}//output? 114
  115. 115. $var = a;for($i = 0; $i 150; $i++) { $var++; echo $var, ;}//output?//b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad ae af ag ahai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb bc bd be bf bgbh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz ca cb cc cd ce cfcg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cy cz da db dc dd dedf dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz ea eb ec edee ef eg eh ei ej ek el em en eo ep eq er es et eu 115
  116. 116. ITS N OT A B UG.ITS A F EATURE : ] 116
  117. 117. 117

×