PHP 5 Sucks! PHP 5 Rocks! Adam Trachtenberg eBay Technical Evangelist [email_address]
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: ???
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?
Come Up With a Plan Install PHP 5 ??????? $$$Profit!!!
Step 1. Install PHP 5 Check out latest version from CVS Run ./buildconf Copy over my PHP 4 config.nice file Run ./config.nice
Step 1. Install PHP 5: config.nice #! /bin/sh # # Created by configure './configure' \ '--prefix=/home/adam' \ '--with-zlib' \ '--with-dom=/home/adam/' \ "$@"
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.
Step 1. Install PHP 5: config.nice $ ./config.nice --with-libxml-dir=/home/adam ... Thank you for using PHP.
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
Step 2. DOM <?xml version=&quot;1.0&quot;?> <talk> <title>PHP 5 Rocks!</title> </talk>
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);
Step 2. DOM Fatal error: Call to undefined function domxml_new_doc() in /home/adam/php5/dom.xml on line 2
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);
Step 2. DOM Fatal error: Call to undefined method DOMDocument::append_child() in /home/adam/php5/dom.xml on line 5
Step 2. DOM $dom = new DOMDocument('1.0'); // create and append the root element, <talk> $talk = $dom->append C hild($dom-> create E lement('talk')); // create and append <title> to $talk $title = $talk->append C hild($dom-> create E lement('title')); // set the text node for $title $title->append C hild($dom-> create T ext N ode('PHP 5 Rocks!')); // print DOM document as XML echo $dom->dump M em(true);
Step 2. DOM Fatal error: Call to undefined method DOMDocument::dumpMem() in /home/adam/php5/dom.xml on line 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 ();
Step 2. DOM <?xml version=&quot;1.0&quot;?> <talk><title>PHP 5 Rocks!</title></talk>
Step 2. DOM <?xml version=&quot;1.0&quot;?> <talk> <title>PHP 5 Rocks!</title> </talk>
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();
Step 2. DOM <?xml version=&quot;1.0&quot;?> <talk> <title>PHP 5 Rocks!</title> </talk>
Step 2. DOM $dom = new DOMDocument ('1.0'); // create and append the root element, <talk> $talk = $dom->append C hild ($dom-> create E lement ('talk')); // create and append <title> to $talk $title = $talk->append C hild ($dom-> create E lement ('title')); // set the text node for $title $title->append C hild ($dom-> create T ext N ode ('PHP 5 Rocks!')); // print DOM document as XML $dom->formatOutput = true; echo $dom-> saveXML ();
Step 2. DOM This extension is EXPERIMENTAL . The behaviour of this extension -- including the names of its functions and anything else documented about this extension -- may change without notice in a future release of PHP. Use this extension at your own risk. Warning
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
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();
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
Step 2. DOM $talk = ' <talk> <title>PHP 5 Rocks!</title> </talk>'; $dom = new DOMDocument; $dom->preserveWhiteSpace = false; $dom->loadXML($talk); // print out &quot;PHP 5 Rocks!“ print $dom->firstChild->firstChild-> firstChild->nodeValue; PHP 5 Rocks!
Step 2. DOM $talk = ' <talk> <title>PHP 5 Rocks!</title> </talk>'; $simplexml = simplexml_load_string($talk); // print out &quot;PHP 5 Rocks!&quot; print $simplexml->title; PHP 5 Rocks!
Step 2. DOM DOM Sucks! SimpleXML Rocks!
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 LA MP This will definitely work! Right?
Step 2. MySQL $db = mysql_connect($server, $user, $password); mysql_select_db(&quot;users&quot;); $r = mysql_query(&quot;SELECT user FROM users&quot;); while ($row = mysql_fetch_assoc($r)) { print $row['user']; } mysql_close();
Step 2. MySQL Fatal error: Call to undefined function mysql_connect() in /home/adam/php5/mysql.php on line 3
Step 2. MySQL MySQL client libraries are no longer bundled with PHP! You must download and install them yourselves.
Step 2. MySQL While I’m at it, I might as well upgrade to MySQL 4.1.
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
Step 2. MySQL $db = mysql_connect($server, $user, $password); mysql_select_db(&quot;users&quot;); $r = mysql_query(&quot;SELECT user FROM users&quot;); while ($row = mysql_fetch_assoc($r)) { print $row['user']; } mysql_close();
Step 2. MySQL $db = mysql i _connect($server, $user, $password); mysql i _select_db(&quot;users&quot;); $r = mysql i _query(&quot;SELECT user FROM users&quot;); while ($row = mysql i _fetch_assoc($r)) { print $row['user']; } mysql i _close();
Step 2. MySQL Warning: Missing argument 2 for mysqli_select_db() in /home/adam/php5/mysql.php on line 7
Step 2. MySQL $db = mysqli_connect($server, $user, $password); mysqli_select_db( $db, &quot;users&quot;); $r = mysqli_query( $db, &quot;SELECT user FROM users&quot;); while ($row = mysqli_fetch_assoc($r)) { print $row['user']; } mysqli_close( $db );
Step 2. MySQL $db = mysqli_connect($server, $user, $password , &quot;users&quot; ); $r = mysqli_query(&quot;SELECT user FROM users&quot;); while ($row = mysqli_fetch_assoc($r)) { print $row['user']; } mysqli_close();
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
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()
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!
Step 2. MySQL $db = new mysqli($server, $user, $password, &quot;users&quot;); $r = mysqli->query(&quot;SELECT user FROM users&quot;); while ($row = $r->fetch_assoc()) { print $row['user']; } unset($db);
Step 2. MySQL $db = new mysqli($server, $username, $password, &quot;users&quot;); $stmt = $db->stmt_init(); if ($stmt->prepare(&quot;SELECT user FROM users&quot;)) { $stmt->bind_result($user); $stmt->execute(); while ($stmt->fetch()) { print $user; } } unset($db);
Step 3. $$$Profit!!! The good news is that I’ve shown you (almost) all the sucky parts of PHP 5. Everything else rocks!
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
Step 3. $$$Profit!!! Object-oriented programming XML DOM SimpleXML XSLT XPath SAX XML Pull Parser
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
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
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: PHP 5 Rocks!
$$$Profit!!! Shameless Plug

PHP 5 Sucks. PHP 5 Rocks.

  • 1.
    PHP 5 Sucks!PHP 5 Rocks! Adam Trachtenberg eBay Technical Evangelist [email_address]
  • 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 BackAgain 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 Witha Plan Install PHP 5 ??????? $$$Profit!!!
  • 5.
    Step 1. InstallPHP 5 Check out latest version from CVS Run ./buildconf Copy over my PHP 4 config.nice file Run ./config.nice
  • 6.
    Step 1. InstallPHP 5: config.nice #! /bin/sh # # Created by configure './configure' \ '--prefix=/home/adam' \ '--with-zlib' \ '--with-dom=/home/adam/' \ &quot;$@&quot;
  • 7.
    Step 1. InstallPHP 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. InstallPHP 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=&quot;1.0&quot;?> <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. DOMFatal 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. DOMFatal 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->append C hild($dom-> create E lement('talk')); // create and append <title> to $talk $title = $talk->append C hild($dom-> create E lement('title')); // set the text node for $title $title->append C hild($dom-> create T ext N ode('PHP 5 Rocks!')); // print DOM document as XML echo $dom->dump M em(true);
  • 16.
    Step 2. DOMFatal 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=&quot;1.0&quot;?> <talk><title>PHP 5 Rocks!</title></talk>
  • 19.
    Step 2. DOM<?xml version=&quot;1.0&quot;?> <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=&quot;1.0&quot;?> <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->append C hild ($dom-> create E lement ('talk')); // create and append <title> to $talk $title = $talk->append C hild ($dom-> create E lement ('title')); // set the text node for $title $title->append C hild ($dom-> create T ext N ode ('PHP 5 Rocks!')); // print DOM document as XML $dom->formatOutput = true; echo $dom-> saveXML ();
  • 23.
    Step 2. DOMThis extension is EXPERIMENTAL . The behaviour of this extension -- including the names of its functions and anything else documented about this extension -- may change without notice in a future release of PHP. Use this extension at your own risk. Warning
  • 24.
    Step 2. DOMDOM 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. DOMFaster 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 &quot;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 &quot;PHP 5 Rocks!&quot; print $simplexml->title; PHP 5 Rocks!
  • 29.
    Step 2. DOMDOM 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 LA MP This will definitely work! Right?
  • 31.
    Step 2. MySQL$db = mysql_connect($server, $user, $password); mysql_select_db(&quot;users&quot;); $r = mysql_query(&quot;SELECT user FROM users&quot;); while ($row = mysql_fetch_assoc($r)) { print $row['user']; } mysql_close();
  • 32.
    Step 2. MySQLFatal error: Call to undefined function mysql_connect() in /home/adam/php5/mysql.php on line 3
  • 33.
    Step 2. MySQLMySQL client libraries are no longer bundled with PHP! You must download and install them yourselves.
  • 34.
    Step 2. MySQLWhile I’m at it, I might as well upgrade to MySQL 4.1.
  • 35.
    Step 2. MySQLHowever, 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(&quot;users&quot;); $r = mysql_query(&quot;SELECT user FROM users&quot;); while ($row = mysql_fetch_assoc($r)) { print $row['user']; } mysql_close();
  • 37.
    Step 2. MySQL$db = mysql i _connect($server, $user, $password); mysql i _select_db(&quot;users&quot;); $r = mysql i _query(&quot;SELECT user FROM users&quot;); while ($row = mysql i _fetch_assoc($r)) { print $row['user']; } mysql i _close();
  • 38.
    Step 2. MySQLWarning: 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, &quot;users&quot;); $r = mysqli_query( $db, &quot;SELECT user FROM users&quot;); while ($row = mysqli_fetch_assoc($r)) { print $row['user']; } mysqli_close( $db );
  • 40.
    Step 2. MySQL$db = mysqli_connect($server, $user, $password , &quot;users&quot; ); $r = mysqli_query(&quot;SELECT user FROM users&quot;); while ($row = mysqli_fetch_assoc($r)) { print $row['user']; } mysqli_close();
  • 41.
    Step 2. MySQLYou 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: MySQLmysql_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. MySQLObject-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, &quot;users&quot;); $r = mysqli->query(&quot;SELECT user FROM users&quot;); while ($row = $r->fetch_assoc()) { print $row['user']; } unset($db);
  • 45.
    Step 2. MySQL$db = new mysqli($server, $username, $password, &quot;users&quot;); $stmt = $db->stmt_init(); if ($stmt->prepare(&quot;SELECT user FROM users&quot;)) { $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
  • 51.
    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: PHP 5 Rocks!
  • 52.