Más contenido relacionado La actualidad más candente (20) Similar a PHP Tips & Tricks (20) PHP Tips & Tricks2. PHP TIPS & TRICKS
AKA
JOURNEY INTO DEPTHS OF MANUAL
2
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
10. SOME OF THESE YOU MAY
KNOW.
SOME DON'T.
IF YOU KNOW BETTER
SOLUTION, PLEASE SHARE :)
10
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. DIRECTORY LISTING #2
$dir = "/application/modules/*";
foreach(glob($dir) as $file) {
echo "Filename is: " . $file . PHP_EOL;
}
15
16. DIRECTORY LISTING #3
$dir = "/application/modules/";
foreach (new DirectoryIterator($dir) as $fileInfo) {
echo "Filename is: " . $fileInfo->getFilename() . PHP_EOL;
}
16
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
19. EXPLODED STRING VALUES
$string = 'bazinga.foo.bar.suitup!'
$values = explode('.', $string);
$sheldon = $values[0]; //bazinga
$barney = $values[3]: //suitup
list($sheldon, , , $barney) = explode('.', $string);
//PHP 5.4 stuff
$sheldon = explode('.', $string)[0];
$barney = explode('.', $string)[3];
19
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
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
26. FIRST NOT EMPTY VARIABLE
$a = null;
$b = false;
$c = 14;
$d = 'foo';
$notEmpty = $a ?: $b ?: $c ?: $d;
echo $notEmpty // 14
26
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 in
echo Value is $obj-foo-bar;
//Value is 123
echo Value is {$obj-foo-bar};
//Same for array
$ar = array('some' = 'var');
echo Value is $ar['some']; //syntax error
echo Value is {$ar['some']}; //Value is var
28
30. MULTIPLE ISSET
$val = null;
$var = true;
if (isset($not_defined) isset($val) isset($var)) {
/* ... */
}
30
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
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 crushes
lizard, lizard poisons Spock...
42
43. 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 crushes
lizard, lizard poisons Spock...
43
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, lizard
poisons Spock...
44
45. STRING CONCATENATION
WHY U SE P RINTF
FAMILY F UNCTIONS,
WHEN W E H AVE S TRING
INTERPOLATION?
45
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
51. ENUM
class 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
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)); // false
var_dump(($a $b)); // true
var_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
59. DID YOU MEAN ...
YOU CAN TRY:
http://php.net/manual/en/
function.levenshtein.php
59
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. PARSING URL PARAMS
parse_str
parse_str('single=Singlecheck[]=check1check[]=fooradio=radio2', $data);
print_r($data);die();
/*Array
(
[single] = Single
[check] = Array
(
[0] = check1
[1] = foo
)
[radio] = radio2
)
*/
63
64. PARSING URL PARAMS
parse_str
parse_str('single=Singlecheck[]=check1check[]=fooradio=radio2', $data);
print_r($data);die();
/*Array
(
[single] = Single
[check] = Array
(
[0] = check1
[1] = foo
)
DOn'tusewithoutsecondparameter!
[radio] = radio2
)
*/
64
65. PARSING URL PARAMS
parse_str
function foo() {
parse_str('single=Singlecheck[]=check1check[]=fooradio=radio2');
print_r(get_defined_vars());die();
}
foo();
Localmagicvariables!
65
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. CSV PARSING
str_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
71. AUTO_PREPEND_FILE
php.ini
auto_prepend_file string
Specifies the name of a file that is automatically parsed before the
main file. The file is included as if it was called with the
require()function, so include_path is used.
The special value none disables auto-prepending.
71
72. AUTO_PREPEND_FILE
php.ini
auto_prepend_file string
Specifies the name of a file that is automatically parsed before the
main file. The file is included as if it was called with the
require()function, so include_path is used.
The special value none disables auto-prepending.
Greatplaceforyourawesomemydie,dump,
debug,pukeetc.functions.
Butbecarefulwhendeploying.
72
76. FILE INCLUDE
//config.php
return array(
'dbName' = 'some',
'dbPass' = 'foo',
'dbPort' = 123
);
//index.php
$config = include 'config.php';
echo $dbPass; //Notice 'undefined'
echo $config['dbName'] = 'some';
76
77. FILE INCLUDE
BTW. T HIS A LSO W ORKS
//function.php
return function($data) {
print_r($data);die();
};
//index.php
$dump = include 'function.php';
$dump(array(hello, 'moto'));
77
79. QUICK COMMENT
function foo() {
$items = array();
foreach (array('some', 'a') as $item) {
if ($item === 'a') {
continue;
}
$items[] = $item;
}
return $items;
}
79
80. QUICK COMMENT
function foo() {
$items = array();
/*
foreach (array('some', 'a') as $item) {
if ($item === 'a') {
continue;
}
$items[] = $item;
}
*/
return $items;
}
80
81. QUICK COMMENT
function foo() {
$items = array();
/* */
foreach (array('some', 'a') as $item) {
if ($item === 'a') {
continue;
}
$items[] = $item;
}
/* */
return $items;
}
81
82. QUICK COMMENT
function foo() {
$items = array();
/* *
foreach (array('some', 'a') as $item) {
if ($item === 'a') {
continue;
}
$items[] = $item;
}
/* */
return $items;
}
82
83. QUICK COMMENT
function foo() {
$items = array();
/* *
foreach (array('some', 'a') as $item) {
if ($item === 'a') {
Anotheroptionsalsopossible
continue;
}
$items[] = $item;
}
/* */
return $items;
}
83
85. ONE LINE VARIABLE SWAP
$a = 123;
$b = 987;
list($a, $b) = array($b, $a);
echo $a; //987
echo $b; //123
//or
$a ^= $b ^= $a ^= $b;
//http://betterexplained.com/articles/swap-two-variables-using-xor/
85
87. COMPACT + EXTRACT
function 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. COMPACT + EXTRACT
function foo() {
$data = array('some' = 'asa', 'foo' = 'asda');
extract($data);
var_dump(get_defined_vars());die();
}
foo();
88
89. COMPACT + EXTRACT
function foo() {
$data = array('some' = 'asa', 'foo' = 'asda');
extract($data);
var_dump(get_defined_vars());die();
}
foo();
Onceagainlocalmagicvariables!
89
91. FIRST ARRAY ELEMENT
$data = array(
'foo' = 123,
'bar' = 1987,
'wee' = 'ugh'
);
//echo $data[0]; //undefined offset
echo reset($data); //123
echo current($data); //123
reset($data);
list(,$value) = each($data);
echo $value; //123
list($value) = array_values($data);
echo $value; //123
echo array_shift($data); //123 - caution - modifies array
//solution?
echo array_shift(array_values($data)); //123 without modifying array
91
93. RANDOM ARRAY ITEM
$data = array(
'foo' = 123,
'bar' = 1987,
'wee' = 'ugh'
);
// not like that - works only for number indexed arrays
without 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
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. 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. 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. MULTIPLE VALUE CHECK
BTW!
in_array($needle, $haystack) works like '=='
in_array($needle, $haystack, true) works like '==='
98
100. EMPTY ARRAY CHECK
$input = array();
//it will work
if (is_array($input) count($input) === 0) {
}
//via @wookiebpl
if ($input === array()) {
}
100
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. 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. INNER ARRAYS OPERATIONS
BUT W ITH T HIS O NE, P EOPLE
OFTEN L OOK A T M E L IKE
SOMEONE W HO'S U SING M AGIC.
110
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
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 ah
ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb bc bd be bf bg
bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz ca cb cc cd ce cf
cg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cy cz da db dc dd de
df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz ea eb ec ed
ee ef eg eh ei ej ek el em en eo ep eq er es et eu
115
116. IT'S N OT A B UG.
IT'S A F EATURE : ]
116