Transcript
Page 1: [PL] Jak nie zostać "programistą" PHP?

JAK NIE ZOSTAĆ „PROGRAMISTĄ” PHP?

DOBRE I ZŁE PRAKTYKI

Page 2: [PL] Jak nie zostać "programistą" PHP?

O MNIE

Radosław Benkel - singles

PHP - 2007

SQL - 2007

JavaScript -2008

Projekty: DELIRIUM, GENOSIS, inne

Page 3: [PL] Jak nie zostać "programistą" PHP?

PHP

CZYM JEST PHP?

Page 4: [PL] Jak nie zostać "programistą" PHP?

PHP

CZYM JEST PHP?

DYNAMICZNIE TYPOWANYM,

OBIEKTOWYM,

SKRYPTOWYM JĘZYKIEM

PROGRAMOWANIA

Page 5: [PL] Jak nie zostać "programistą" PHP?

JAKA JEST NAJWIĘKSZA WADA A JEDNOCZEŚNIE

ZALETA PHP?

Page 6: [PL] Jak nie zostać "programistą" PHP?
Page 7: [PL] Jak nie zostać "programistą" PHP?

<?PHP

Page 8: [PL] Jak nie zostać "programistą" PHP?
Page 9: [PL] Jak nie zostać "programistą" PHP?
Page 11: [PL] Jak nie zostać "programistą" PHP?

WYŚWIETLANIE BŁĘDÓW

Page 12: [PL] Jak nie zostać "programistą" PHP?

WYŚWIETLANIE BŁĘDÓW

Page 13: [PL] Jak nie zostać "programistą" PHP?

WYŚWIETLANIE BŁĘDÓW

php.ini error_reporting = E_ALL | E_STRICTdisplay_errors = On

Page 14: [PL] Jak nie zostać "programistą" PHP?

WYŚWIETLANIE BŁĘDÓW

php.ini error_reporting = E_ALL | E_STRICTdisplay_errors = On

*.php<?phperror_reporting(E_ALL | E_STRICT)ini_set('display_errors', 'On')

Page 15: [PL] Jak nie zostać "programistą" PHP?

WYŚWIETLANIE BŁĘDÓW

php.ini error_reporting = E_ALL | E_STRICTdisplay_errors = On

*.php<?phperror_reporting(E_ALL | E_STRICT)ini_set('display_errors', 'On')

.htaccess php_flag display_errors onphp_value error_reporting 32767

Page 16: [PL] Jak nie zostać "programistą" PHP?

WYŚWIETLANIE BŁĘDÓW

@

Page 17: [PL] Jak nie zostać "programistą" PHP?

INNE DYREKTYWY PHP.INI

Page 18: [PL] Jak nie zostać "programistą" PHP?

INNE DYREKTYWY PHP.INI

register_globals = Off

Page 19: [PL] Jak nie zostać "programistą" PHP?

INNE DYREKTYWY PHP.INI

<?php

//register_globals = On$title // 'Foo'$_GET['title'] // 'Foo'

//register_globals = Off$title // undefined$_GET['title'] // 'Foo'

http://www.example.com/find.php?title=Foo

Page 20: [PL] Jak nie zostać "programistą" PHP?

INNE DYREKTYWY PHP.INI

register_globals = Off

magic_quotes_gpc = Off

Page 21: [PL] Jak nie zostać "programistą" PHP?

INNE DYREKTYWY PHP.INI

register_globals = Off

magic_quotes_gpc = Off

magic_quotes_runtime = Off

Page 22: [PL] Jak nie zostać "programistą" PHP?

GET, POST [, PUT, DELETE]

Page 24: [PL] Jak nie zostać "programistą" PHP?

FILTROWANIE WEJŚCIA I WYJŚĆIA

Page 25: [PL] Jak nie zostać "programistą" PHP?

FILTROWANIE WEJŚCIA I WYJŚCIA

<?php$search_html = filter_input( INPUT_GET, 'foo', FILTER_SANITIZE_SPECIAL_CHARS);

WEJŚCIE:

WYJŚCIE:

<?php echo htmlspecialchars($foo, ENT_NOQUOTES);

Page 26: [PL] Jak nie zostać "programistą" PHP?

A CO Z SQL?

Page 27: [PL] Jak nie zostać "programistą" PHP?

PDO(PHP DATA OBJECTS)

Page 28: [PL] Jak nie zostać "programistą" PHP?

PDO

<?php

//PDOtry { $db = new PDO('mysql:host=hostname:dbname=some', 'username', 'password', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF-8');

} catch (PDOException $e) { die($e->getMessage());}

$query = 'SELECT * FROM my_table WHERE cat_id = :id AND title = :title';

$stmt = $db->prepare($query);$stmt->bindValue(':id', $id, PDO::PARAM_INT);$stmt->bindValue(':title', $myTitle, PDO::PARAM_STR, 12);$stmt->execute();

while($row = $stmt->fetch(PDO::FETCH_OBJ)) { // ..}

Page 29: [PL] Jak nie zostać "programistą" PHP?

GLOBAL TO ZŁO!

Page 30: [PL] Jak nie zostać "programistą" PHP?

GLOBAL TO ZŁO!

"JEŚLI DZIECKO TWE, UŻYWA GLOBALA, TO WIEDZ, ŻE COŚ SIĘ Z NIM DZIEJE"

Page 31: [PL] Jak nie zostać "programistą" PHP?

PARAMETRY FUNKCJI A REFERENCJA

Page 32: [PL] Jak nie zostać "programistą" PHP?

PARAMETRY FUNKCJI A REFERENCJA

<?php

function change($a, $o) { $a['foo'] = 2; $o->bar = 2;}

$arr = array('foo' => 1);$obj = new stdClass();$obj->$bar = 1;

change($arr, $obj);

echo $arr['foo']; //displays 1echo $obj->bar; //displays 2

Page 33: [PL] Jak nie zostać "programistą" PHP?

INCLUDE/REQUIRE(_ONCE)

Page 34: [PL] Jak nie zostać "programistą" PHP?

AUTOLOADING

Page 35: [PL] Jak nie zostać "programistą" PHP?

AUTOLOADING

<?phpfunction __autoload($name) { if (file_exists($name . '.php')) { require_once($name. '.php'); }}

$a = new Foo(); //autoload file Foo.php from current directory

Page 36: [PL] Jak nie zostać "programistą" PHP?

FOR => FOREACH

Page 37: [PL] Jak nie zostać "programistą" PHP?

FOR => FOREACH

<?php

//DONT DO THAT!for ($i = 0; $o < count($names); $i++) { $name['surname'] = mysql_query("SELECT surname FROM surnames WHERE name '{$names[i]}'");}

$names = array( 'John' => 'Doe', 'Chuck' => 'Norris');

foreach ($names as $lastName) { echo $lastName, "\n";}

foreach ($names as $firstName => $lastName) { echo $firstName . ':' . $lastName;}

Page 38: [PL] Jak nie zostać "programistą" PHP?

== VS ===

Page 39: [PL] Jak nie zostać "programistą" PHP?

== VS ===

// "===" MEANS THAT THEY ARE IDENTICAL // "==" MEANS THAT THEY ARE EQUAL // "!=" MEANS THAT THEY AREN'T EQUAL.

FALSE NULL ARRAY() 0 "0" 0X0 "0X0" "000" "0000"FALSE === == == == == == != != != NULL == === == == != == != != != ARRAY() == == === != != != != != != 0 == == != === == === == == == "0" == != != == === == == == == 0X0 == == != === == === == == == "0X0" != != != == == == === == == "000" != != != == == == == === == "0000" != != != == == == == == ===

HTTP://STACKOVERFLOW.COM/QUESTIONS/80646/HOW-DO-THE-EQUALITY-DOUBLE-EQUALS-AND-IDENTITY-

TRIPLE-EQUALS-COMPARISO

Page 40: [PL] Jak nie zostać "programistą" PHP?

OUTPUT BUFFERING

Page 41: [PL] Jak nie zostać "programistą" PHP?

OUTPUT BUFFERING

Cannot add/modify header information - headers already sent by...

Page 42: [PL] Jak nie zostać "programistą" PHP?

OUTPUT BUFFERING

*.php<?phpob_start();//some codeheader('Location: http://e.com')ob_end_flush();

php.ini output_buffering = On

UTF BOM UWAGA

Page 43: [PL] Jak nie zostać "programistą" PHP?

EVAL IS EVIL

Page 44: [PL] Jak nie zostać "programistą" PHP?

VARIABLE VARIABLES

Page 45: [PL] Jak nie zostać "programistą" PHP?

VARIABLE VARIABLES

// variable variablesclass Some{ public function foo() { return "Hello World"; }}

$foo = 'Hello World';$bar = 'foo';

echo $$bar; //displays 'Hello World'

$obj = new Some();echo $obj->$foo(); //displays Hello World

//much better!call_user_func(array($obj, $foo));call_user_func(array('Some', $foo));

Page 46: [PL] Jak nie zostać "programistą" PHP?

STRINGI

Page 47: [PL] Jak nie zostać "programistą" PHP?

STRINGI

JAKIE MAMY RODZAJE STRINGÓW?

Page 48: [PL] Jak nie zostać "programistą" PHP?

STRINGI

Page 49: [PL] Jak nie zostać "programistą" PHP?

STRINGI (W PHP;-)

SINGLE QUOTED

DOUBLE QUOTED

HEREDOC

NOWDOC (PHP 5.3)

Page 50: [PL] Jak nie zostać "programistą" PHP?

STRINGI (W PHP;-)

<?php

$ex1 = 'Value of var foo is $foo';$ex2 = "Value of var foo is $foo";$ex3 = <<<HDValue of foois$fooHD;$ex4 = <<<'ND'Value offoois $foo'ND';

echo $ex1 . "\n"; // Value of var foo is $fooecho $ex2 . "\n"; // Value of var foo is barecho $ex3 . "\n"; // Value of var foo is barecho $ex4 . "\n"; // Value of var foo is $foo

Page 51: [PL] Jak nie zostać "programistą" PHP?

KODOWANIE ZNAKÓW

Page 52: [PL] Jak nie zostać "programistą" PHP?

KODOWANIE ZNAKÓW

Page 53: [PL] Jak nie zostać "programistą" PHP?

KODOWANIE ZNAKÓW

"ONE CHARSET TO RULE THEM ALL"

Page 54: [PL] Jak nie zostać "programistą" PHP?

KODOWANIE ZNAKÓW

UTF-8ALE.... MB_*

Page 55: [PL] Jak nie zostać "programistą" PHP?

MAGIA W PHP

Page 56: [PL] Jak nie zostać "programistą" PHP?

MAGIA W PHP

Przygody

Harrego

Pottera

Page 57: [PL] Jak nie zostać "programistą" PHP?

MAGIA W PHP

__construct

__destruct

__call

__callStatic

__get

__set

__isset

__unset

__sleep

__wakeup

__toString

__invoke

__set_state

__clone

Page 58: [PL] Jak nie zostać "programistą" PHP?

MAGIA W PHP

<?php

class Foo { private $_properties = array( 'foo' => 123, 'bar' => 456 ); public function __get($var) { if (!array_key_exists($var, $this->_properties)) { return null; } return $this->_properties[$var]; } public function __set($var, $value) { if (!array_key_exists($var, $this->_properties)) { throw new Exception('You cannot set that property'); } else { $this->_properties[$var] = $value; } }}

$obj = new Foo();$obj->foo; //gives 123$obj->nonExists; //throws Exception

Page 59: [PL] Jak nie zostać "programistą" PHP?

MAGIA W PHP

Page 60: [PL] Jak nie zostać "programistą" PHP?

RETURN

Page 61: [PL] Jak nie zostać "programistą" PHP?

RETURN

<?php

function foo() { return 'Hello World';}

function bar() { echo 'Hello World';}

echo foo(); // Hello World <- GOODbar(); // Hello World <- BAD

Page 62: [PL] Jak nie zostać "programistą" PHP?

XDEBUG

Page 63: [PL] Jak nie zostać "programistą" PHP?

XDEBUG

Page 64: [PL] Jak nie zostać "programistą" PHP?

APC, EACCLERATOR, XCACHE, ZEND OPTIMIZER

Page 65: [PL] Jak nie zostać "programistą" PHP?

JAKA WERSJA PHP?

Page 66: [PL] Jak nie zostać "programistą" PHP?

PHP4

Page 67: [PL] Jak nie zostać "programistą" PHP?

PHP4

Page 68: [PL] Jak nie zostać "programistą" PHP?

PHP 5.2.XPHP4

Page 69: [PL] Jak nie zostać "programistą" PHP?

PHP 5.2.XPHP4

Page 70: [PL] Jak nie zostać "programistą" PHP?

PHP 5.3.X

PHP 5.2.XPHP4

Page 71: [PL] Jak nie zostać "programistą" PHP?

PHP 5.3.X

PHP 5.2.XPHP4

Page 72: [PL] Jak nie zostać "programistą" PHP?

PHP 5.3

Page 73: [PL] Jak nie zostać "programistą" PHP?

PHP 5.3

PRZESTRZENIE NAZW

LAMBDAS/CLOSURES

LATE STATIC BINDING

__CALLSTATIC

GOTO

WYDAJNOŚĆ - DO 30% SZYBSZE

Page 74: [PL] Jak nie zostać "programistą" PHP?

?>

Page 75: [PL] Jak nie zostać "programistą" PHP?

VCS = VERSION CONTROL

SYSTEM

Page 77: [PL] Jak nie zostać "programistą" PHP?

IDE? EDYTOR PROGRAMISTY?

NOTATNIK?

Page 78: [PL] Jak nie zostać "programistą" PHP?

WINDOWS + WEBDEV ?

Page 79: [PL] Jak nie zostać "programistą" PHP?
Page 80: [PL] Jak nie zostać "programistą" PHP?

NIE WYNAJDUJ KOŁA NA NOWO

Page 81: [PL] Jak nie zostać "programistą" PHP?
Page 82: [PL] Jak nie zostać "programistą" PHP?

FRAMEWORKI

Page 83: [PL] Jak nie zostać "programistą" PHP?

FRAMEWORKI

Page 84: [PL] Jak nie zostać "programistą" PHP?

FRAMEWORKI

ALE

Page 85: [PL] Jak nie zostać "programistą" PHP?

FRAMEWORKI

ALE

Page 86: [PL] Jak nie zostać "programistą" PHP?

FRAMEWORKI

MVC VS MVP

Page 87: [PL] Jak nie zostać "programistą" PHP?

FRAMEWORKI

MVC VS MVP

Page 88: [PL] Jak nie zostać "programistą" PHP?

MÓJ KOD NIE DZIAŁA!!!

Page 89: [PL] Jak nie zostać "programistą" PHP?

MÓJ KOD NIE DZIAŁA!!!

while(!foundAnswer()) { checkManual();}

Page 90: [PL] Jak nie zostać "programistą" PHP?

MÓJ KOD NIE DZIAŁA!!!

Page 91: [PL] Jak nie zostać "programistą" PHP?

MÓJ KOD NIE DZIAŁA!!!

Page 92: [PL] Jak nie zostać "programistą" PHP?

JAK SIĘ UCZYĆ?

Page 93: [PL] Jak nie zostać "programistą" PHP?

JAK SIĘ UCZYĆ?

Page 94: [PL] Jak nie zostać "programistą" PHP?

JAK SIĘ UCZYĆ?

HTTP://PLANETA.PHP.PL/

Page 95: [PL] Jak nie zostać "programistą" PHP?

JAK PISAĆ KOD?

Page 96: [PL] Jak nie zostać "programistą" PHP?

JAK PISAĆ KOD?

"PISZ KOD TAK, JAKBY OSOBA,

KTÓRA GO PO TOBIE PRZEJMIE, BYŁA UZBROJONYM PSYCHOPATĄ

ZNAJĄCYM TWÓJ ADRES"

Page 97: [PL] Jak nie zostać "programistą" PHP?

JAK PISAĆ KOD?

Page 98: [PL] Jak nie zostać "programistą" PHP?

JAK PISAĆ KOD?

STYL KODOWANIA

Page 99: [PL] Jak nie zostać "programistą" PHP?

ODPOWIEDNIE NARZĘDZIE DO ZADANIA

Page 100: [PL] Jak nie zostać "programistą" PHP?
Page 101: [PL] Jak nie zostać "programistą" PHP?

DZIĘKI!

Page 102: [PL] Jak nie zostać "programistą" PHP?

PYTANIA?UWAGI?

Page 103: [PL] Jak nie zostać "programistą" PHP?

RADOSŁAW BENKEL

SINGLES

HTTP://BLOG.RBENKEL.ME

@SINGLESPL