Upload
radek-benkel
View
5.424
Download
8
Embed Size (px)
DESCRIPTION
Po sieci krąży wiele opinii, jak to programiści PHP nie są prawdziwymi programistami i że PHP to w ogóle nie jest język programowania, etc. A winni takiego stanu rzeczy są sami programiści bądź właśnie „programiści”. Dlaczego? W każdym języku da się napisać kod zły jak i dobry. A w świecie PHP niestety dużo jest tego złego – choć trend ten zmienia się na lepsze. Celem wykładu jest zapoznanie uczestników z rzeczami, na które należy zwrócić uwagę podczas tworzenia aplikacji w języku PHP. Druga (krótsza) część prezentacji będzie poświęcona ogólnym dobrym praktykom programistycznym, nie związanym z żadnym konkretnym językiem.
Citation preview
JAK NIE ZOSTAĆ „PROGRAMISTĄ” PHP?
DOBRE I ZŁE PRAKTYKI
O MNIE
Radosław Benkel - singles
PHP - 2007
SQL - 2007
JavaScript -2008
Projekty: DELIRIUM, GENOSIS, inne
PHP
CZYM JEST PHP?
PHP
CZYM JEST PHP?
DYNAMICZNIE TYPOWANYM,
OBIEKTOWYM,
SKRYPTOWYM JĘZYKIEM
PROGRAMOWANIA
JAKA JEST NAJWIĘKSZA WADA A JEDNOCZEŚNIE
ZALETA PHP?
<?PHP
HTTP://WWW.FLICKR.COM/PHOTOS/HATM/3448824312/ BY HATM
WYŚWIETLANIE BŁĘDÓW
WYŚWIETLANIE BŁĘDÓW
WYŚWIETLANIE BŁĘDÓW
php.ini error_reporting = E_ALL | E_STRICTdisplay_errors = On
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')
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
WYŚWIETLANIE BŁĘDÓW
@
INNE DYREKTYWY PHP.INI
INNE DYREKTYWY PHP.INI
register_globals = Off
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
INNE DYREKTYWY PHP.INI
register_globals = Off
magic_quotes_gpc = Off
INNE DYREKTYWY PHP.INI
register_globals = Off
magic_quotes_gpc = Off
magic_quotes_runtime = Off
GET, POST [, PUT, DELETE]
GET, POST [,PUT, DELETE]
HTTP://EXAMPLE.COM/INDEX.PHP?ID=123&TITLE=FOO
HTTP://WWW.ONET.TV/JUSTIN-BIEBER-TRAFI-NA-ODWYK,9025126,1,KLIP.HTML#
$_GET
FILTROWANIE WEJŚCIA I WYJŚĆIA
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);
A CO Z SQL?
PDO(PHP DATA OBJECTS)
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)) { // ..}
GLOBAL TO ZŁO!
GLOBAL TO ZŁO!
"JEŚLI DZIECKO TWE, UŻYWA GLOBALA, TO WIEDZ, ŻE COŚ SIĘ Z NIM DZIEJE"
PARAMETRY FUNKCJI A REFERENCJA
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
INCLUDE/REQUIRE(_ONCE)
AUTOLOADING
AUTOLOADING
<?phpfunction __autoload($name) { if (file_exists($name . '.php')) { require_once($name. '.php'); }}
$a = new Foo(); //autoload file Foo.php from current directory
FOR => FOREACH
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;}
== VS ===
== 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
OUTPUT BUFFERING
OUTPUT BUFFERING
Cannot add/modify header information - headers already sent by...
OUTPUT BUFFERING
*.php<?phpob_start();//some codeheader('Location: http://e.com')ob_end_flush();
php.ini output_buffering = On
UTF BOM UWAGA
EVAL IS EVIL
VARIABLE VARIABLES
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));
STRINGI
STRINGI
JAKIE MAMY RODZAJE STRINGÓW?
STRINGI
STRINGI (W PHP;-)
SINGLE QUOTED
DOUBLE QUOTED
HEREDOC
NOWDOC (PHP 5.3)
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
KODOWANIE ZNAKÓW
KODOWANIE ZNAKÓW
KODOWANIE ZNAKÓW
"ONE CHARSET TO RULE THEM ALL"
KODOWANIE ZNAKÓW
UTF-8ALE.... MB_*
MAGIA W PHP
MAGIA W PHP
Przygody
Harrego
Pottera
MAGIA W PHP
__construct
__destruct
__call
__callStatic
__get
__set
__isset
__unset
__sleep
__wakeup
__toString
__invoke
__set_state
__clone
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
MAGIA W PHP
RETURN
RETURN
<?php
function foo() { return 'Hello World';}
function bar() { echo 'Hello World';}
echo foo(); // Hello World <- GOODbar(); // Hello World <- BAD
XDEBUG
XDEBUG
APC, EACCLERATOR, XCACHE, ZEND OPTIMIZER
JAKA WERSJA PHP?
PHP4
PHP4
PHP 5.2.XPHP4
PHP 5.2.XPHP4
PHP 5.3.X
PHP 5.2.XPHP4
PHP 5.3.X
PHP 5.2.XPHP4
PHP 5.3
PHP 5.3
PRZESTRZENIE NAZW
LAMBDAS/CLOSURES
LATE STATIC BINDING
__CALLSTATIC
GOTO
WYDAJNOŚĆ - DO 30% SZYBSZE
?>
VCS = VERSION CONTROL
SYSTEM
VCS
HTTP://STACKOVERFLOW.COM/QUESTIONS/132520/GOOD-EXCUSES-NOT-
TO-USE-VERSION-CONTROL
IDE? EDYTOR PROGRAMISTY?
NOTATNIK?
WINDOWS + WEBDEV ?
NIE WYNAJDUJ KOŁA NA NOWO
FRAMEWORKI
FRAMEWORKI
FRAMEWORKI
ALE
FRAMEWORKI
ALE
FRAMEWORKI
MVC VS MVP
FRAMEWORKI
MVC VS MVP
MÓJ KOD NIE DZIAŁA!!!
MÓJ KOD NIE DZIAŁA!!!
while(!foundAnswer()) { checkManual();}
MÓJ KOD NIE DZIAŁA!!!
MÓJ KOD NIE DZIAŁA!!!
JAK SIĘ UCZYĆ?
JAK SIĘ UCZYĆ?
JAK PISAĆ KOD?
JAK PISAĆ KOD?
"PISZ KOD TAK, JAKBY OSOBA,
KTÓRA GO PO TOBIE PRZEJMIE, BYŁA UZBROJONYM PSYCHOPATĄ
ZNAJĄCYM TWÓJ ADRES"
JAK PISAĆ KOD?
JAK PISAĆ KOD?
STYL KODOWANIA
ODPOWIEDNIE NARZĘDZIE DO ZADANIA
DZIĘKI!
PYTANIA?UWAGI?
RADOSŁAW BENKEL
SINGLES
HTTP://BLOG.RBENKEL.ME
@SINGLESPL