PHP 5 Sucks! PHP 5 Rocks! - PowerPoint PPT Presentation

faris
php 5 sucks php 5 rocks l.
Skip this Video
Loading SlideShow in 5 Seconds..
PHP 5 Sucks! PHP 5 Rocks! PowerPoint Presentation
Download Presentation
PHP 5 Sucks! PHP 5 Rocks!

play fullscreen
1 / 52
Download Presentation
PHP 5 Sucks! PHP 5 Rocks!
250 Views
Download Presentation

PHP 5 Sucks! PHP 5 Rocks!

- - - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript

  1. PHP 5 Sucks!PHP 5 Rocks! Adam Trachtenberg eBay Technical Evangelist amt@php.net

  2. In the Beginning... • SOAP Sucks! SOAP Rocks! • Conclusion: SOAP Sucks and Rocks! • mod_perl 2.0 Sucks! mod_perl 2.0 Rocks! • Conclusion: mod_perl 2.0 Sucks! • PHP 5 Sucks! PHP 5 Rocks! • Conclusion: ???

  3. There and Back Again • I decide I should stop “learning” PHP 5 via the mailing list and start actually programming in it. • The lies begin • “I’m a pretty good PHP 4 programmer” • “I’ve already switched from 2 to 3, and 3 to 4, so I know how to migrate versions” • “Besides, documentation is for wimps.” • So, PHP 5 shouldn’t be too difficult to learn. • Right?

  4. Come Up With a Plan • Install PHP 5 • ??????? • $$$Profit!!!

  5. Step 1. Install PHP 5 • Check out latest version from CVS • Run ./buildconf • Copy over my PHP 4 config.nice file • Run ./config.nice

  6. Step 1. Install PHP 5: config.nice #! /bin/sh # # Created by configure './configure' \ '--prefix=/home/adam' \ '--with-zlib' \ '--with-dom=/home/adam/' \ "$@"

  7. Step 1. Install PHP 5: config.nice $ ./config.nice ... Configuring extensions checking whether to enable LIBXML support... yes checking libxml2 install dir... no configure: error: xml2-config not found. Please check your libxml2 installation.

  8. Step 1. Install PHP 5: config.nice $ ./config.nice --with-libxml-dir=/home/adam ... Thank you for using PHP.

  9. Step 2. ??????? • Maybe I should run some PHP 4 scripts and see how they work under PHP 5 • Let’s start with a simple DOMXML program

  10. Step 2. DOM <?xml version="1.0"?> <talk> <title>PHP 5 Rocks!</title> </talk>

  11. Step 2. DOM $dom = domxml_new_doc('1.0'); // create and append the root element, <talk> $talk = $dom->append_child($dom-> create_element('talk')); // create and append <title> to $talk $title = $talk->append_child($dom-> create_element('title')); // set the text node for $title $title->append_child($dom-> create_text_node('PHP 5 Rocks!')); // print DOM document as XML echo $dom->dump_mem(true);

  12. Step 2. DOM Fatal error: Call to undefined function domxml_new_doc() in /home/adam/php5/dom.xml on line 2

  13. Step 2. DOM $dom = new DOMDocument('1.0'); // create and append the root element, <talk> $talk = $dom->append_child($dom-> create_element('talk')); // create and append <title> to $talk $title = $talk->append_child($dom-> create_element('title')); // set the text node for $title $title->append_child($dom-> create_text_node('PHP 5 Rocks!')); // print DOM document as XML echo $dom->dump_mem(true);

  14. Step 2. DOM Fatal error: Call to undefined method DOMDocument::append_child() in /home/adam/php5/dom.xml on line 5

  15. Step 2. DOM $dom = new DOMDocument('1.0'); // create and append the root element, <talk> $talk = $dom->appendChild($dom-> createElement('talk')); // create and append <title> to $talk $title = $talk->appendChild($dom-> createElement('title')); // set the text node for $title $title->appendChild($dom-> createTextNode('PHP 5 Rocks!')); // print DOM document as XML echo $dom->dumpMem(true);

  16. Step 2. DOM Fatal error: Call to undefined method DOMDocument::dumpMem() in /home/adam/php5/dom.xml on line 17

  17. Step 2. DOM $dom = new DOMDocument('1.0'); // create and append the root element, <talk> $talk = $dom->appendChild($dom-> createElement('talk')); // create and append <title> to $talk $title = $talk->appendChild($dom-> createElement('title')); // set the text node for $title $title->appendChild($dom-> createTextNode('PHP 5 Rocks!')); // print DOM document as XML echo $dom->saveXML();

  18. Step 2. DOM <?xml version="1.0"?> <talk><title>PHP 5 Rocks!</title></talk>

  19. Step 2. DOM <?xml version="1.0"?> <talk> <title>PHP 5 Rocks!</title> </talk>

  20. Step 2. DOM $dom = new DOMDocument('1.0'); // create and append the root element, <talk> $talk = $dom->appendChild($dom-> createElement('talk')); // create and append <title> to $talk $title = $talk->appendChild($dom-> createElement('title')); // set the text node for $title $title->appendChild($dom-> createTextNode('PHP 5 Rocks!')); // print DOM document as XML $dom->formatOutput = true; echo $dom->saveXML();

  21. Step 2. DOM <?xml version="1.0"?> <talk> <title>PHP 5 Rocks!</title> </talk>

  22. Step 2. DOM $dom = new DOMDocument('1.0'); // create and append the root element, <talk> $talk = $dom->appendChild ($dom-> createElement ('talk')); // create and append <title> to $talk $title = $talk->appendChild ($dom-> createElement ('title')); // set the text node for $title $title->appendChild ($dom-> createTextNode ('PHP 5 Rocks!')); // print DOM document as XML $dom->formatOutput = true; echo $dom->saveXML();

  23. Step 2. DOM

  24. Step 2. DOM • DOM objects are now actually objects • Easy to integrate within OOP • Subclass them to define your own methods • DOM methods now use studlyCaps • Just like the rest of the world • DOM behaves like the specification • Properties are actually properties instead of methods

  25. Step 2. DOM $dom = new DOMDocument('1.0'); // create and append the root element, <talk> $talk = $dom->appendChild( new DOMElement('talk')); // create and append <title> to $talk $title = $talk->appendChild( new DOMElement('title')); // set the text node for $title $title->appendChild( new DOMText('PHP 5 Rocks!')); // print DOM document as XML echo $dom->saveXML();

  26. Step 2. DOM • Faster than before • Doesn’t leak memory • Supports more DOM features • Plays well with other XML extensions, like XSLT, XPath, and SimpleXML

  27. Step 2. DOM $talk = ' <talk> <title>PHP 5 Rocks!</title> </talk>'; $dom = new DOMDocument; $dom->preserveWhiteSpace = false; $dom->loadXML($talk); // print out "PHP 5 Rocks!“ print $dom->firstChild->firstChild-> firstChild->nodeValue; PHP 5 Rocks!

  28. Step 2. DOM $talk = ' <talk> <title>PHP 5 Rocks!</title> </talk>'; $simplexml = simplexml_load_string($talk); // print out "PHP 5 Rocks!" print $simplexml->title; PHP 5 Rocks!

  29. Step 2. DOM • DOM Sucks! • SimpleXML Rocks!

  30. Step 2. ??????? • Maybe I should run some PHP 4 scripts and see how they work under PHP 5 • Let’s start with a simple DOMXML program • Well, that didn’t go as smoothly as I thought, but I can always rely on MySQL • After all MySQL and PHP put the MP in LAMP • This will definitely work! • Right?

  31. Step 2. MySQL $db = mysql_connect($server, $user, $password); mysql_select_db("users"); $r = mysql_query("SELECT user FROM users"); while ($row = mysql_fetch_assoc($r)) { print $row['user']; } mysql_close();

  32. Step 2. MySQL Fatal error: Call to undefined function mysql_connect() in /home/adam/php5/mysql.php on line 3

  33. Step 2. MySQL • MySQL client libraries are no longer bundled with PHP! • You must download and install them yourselves.

  34. Step 2. MySQL • While I’m at it, I might as well upgrade to MySQL 4.1.

  35. Step 2. MySQL • However, MySQL 4.1 uses a new client protocol... • Turns out, there’s a new MySQL extension dedicated to MySQL 4.1 and greater • MySQLi • The “i” stands for improved

  36. Step 2. MySQL $db = mysql_connect($server, $user, $password); mysql_select_db("users"); $r = mysql_query("SELECT user FROM users"); while ($row = mysql_fetch_assoc($r)) { print $row['user']; } mysql_close();

  37. Step 2. MySQL $db = mysqli_connect($server, $user, $password); mysqli_select_db("users"); $r = mysqli_query("SELECT user FROM users"); while ($row = mysqli_fetch_assoc($r)) { print $row['user']; } mysqli_close();

  38. Step 2. MySQL Warning: Missing argument 2 for mysqli_select_db() in /home/adam/php5/mysql.php on line 7

  39. Step 2. MySQL $db = mysqli_connect($server, $user, $password); mysqli_select_db($db, "users"); $r = mysqli_query($db, "SELECT user FROM users"); while ($row = mysqli_fetch_assoc($r)) { print $row['user']; } mysqli_close($db);

  40. Step 2. MySQL $db = mysqli_connect($server, $user, $password, "users"); $r = mysqli_query("SELECT user FROM users"); while ($row = mysqli_fetch_assoc($r)) { print $row['user']; } mysqli_close();

  41. Step 2. MySQL • You now need to always pass a database handle to MySQL functions • Also, some older functions have been removed • So, I compiled a list of functions that have been changed or deleted between the MySQL and MySQLi extension

  42. Step 2: MySQL • mysql_connect([string hostname[:port][:/path/to/socket] [, string username [, string pa\ssword [, bool new [, int flags]]]]]) • mysql_select_db(string database_name [, int link_identifier]) • mysql_query(string query [, int link_identifier]) • mysql_fetch_field(resource result [, int field_offset]) • mysql_change_user(string user, string password [, string database [, resource link_identifier]]) • mysql_real_escape_string(string to_be_escaped [, int link_identifier]) • mysql_affected_rows([int link_identifier]) • mysql_close([int link_identifier]) • mysql_error([int link_identifier]) • mysql_errno([int link_identifier]) • mysql_get_host_info([int link_identifier]) • mysql_get_proto_info([int link_identifier]) • mysql_get_server_info([int link_identifier]) • mysql_info([int link_identifier]) • mysql_insert_id([int link_identifier]) • mysql_ping([int link_identifier]) • mysql_stat([int link_identifier]) • mysql_thread_id([int link_identifier]) • mysql_create_db($database, $db); • mysql_drop_db($database, $db); • mysql_escape_string($string); • mysql_field_flags($result, $i); • mysql_field_len($result, $i) • mysql_field_name($result, $i) • mysql_field_table($result, $i) • mysql_field_type($result, $i) • mysql_db_name($result, $i) • mysql_db_query($database, $query, $db); • mysql_list_dbs($db); • mysql_list_fields($database, $table, $db) • mysql_list_processes($db) • mysql_list_tables($database, $db) • mysql_pconnect($hostname, $username, $password); • mysql_result($result, $column); • mysql_tablename($result, $i) • mysql_unbuffered_query()

  43. Step 2. MySQL • Object-oriented interface • Prepared statements • Bound input and output parameters • SSL connections • Multi-query function • Subselects • Internationalization • Whole lots more! • This rocks!

  44. Step 2. MySQL $db = new mysqli($server, $user, $password, "users"); $r = mysqli->query("SELECT user FROM users"); while ($row = $r->fetch_assoc()) { print $row['user']; } unset($db);

  45. Step 2. MySQL $db = new mysqli($server, $username, $password, "users"); $stmt = $db->stmt_init(); if ($stmt->prepare("SELECT user FROM users")) { $stmt->bind_result($user); $stmt->execute(); while ($stmt->fetch()) { print $user; } } unset($db);

  46. Step 3. $$$Profit!!! • The good news is that I’ve shown you (almost) all the sucky parts of PHP 5. • Everything else rocks!

  47. Step 3. $$$Profit!!! • Object-oriented programming • Constructors • Destructors • Public, protected, and private properties and methods • Interfaces • Abstract classes • Class type hints • Static properties and methods • Final properties and methods • A whole suite of magical methods • Proper references

  48. Step 3. $$$Profit!!! • Object-oriented programming • XML • DOM • SimpleXML • XSLT • XPath • SAX • XML Pull Parser

  49. Step 3. $$$Profit!!! • Object-oriented programming • XML • SQLite • Embedded database library • Guarantees access to database in PHP 5 • Not “Lite” at all: • Transactions • Triggers • Subselects

  50. Step 3. $$$Profit!!! • Object-oriented programming • XML • SQLite • Iterators • Error handling with exceptions • SOAP extension • Streams, wrappers, and filters • Reflection classes • Better command line processing • Compliant HTML from Tidy