520 likes | 824 Views
PHP 5 Sucks! PHP 5 Rocks!. Adam Trachtenberg eBay Technical Evangelist amt@php.net. 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: ???.
E N D
PHP 5 Sucks!PHP 5 Rocks! Adam Trachtenberg eBay Technical Evangelist amt@php.net
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="1.0"?> <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->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);
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="1.0"?> <talk><title>PHP 5 Rocks!</title></talk>
Step 2. DOM <?xml version="1.0"?> <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="1.0"?> <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 • 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 "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 "PHP 5 Rocks!" 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 LAMP • This will definitely work! • Right?
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();
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("users"); $r = mysql_query("SELECT user FROM users"); while ($row = mysql_fetch_assoc($r)) { print $row['user']; } mysql_close();
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();
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, "users"); $r = mysqli_query($db, "SELECT user FROM users"); while ($row = mysqli_fetch_assoc($r)) { print $row['user']; } mysqli_close($db);
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();
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, "users"); $r = mysqli->query("SELECT user FROM users"); while ($row = $r->fetch_assoc()) { print $row['user']; } unset($db);
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);
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