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

Preview:

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

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]

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

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 SIĘ UCZYĆ?

HTTP://PLANETA.PHP.PL/

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

Recommended