520 likes | 845 Views
Adam Trachtenberg: eBay Evangelist. There and Back Again. I decide I ... Adam Trachtenberg: eBay Evangelist. Step 2. DOM. Fatal error: Call to undefined function ...
E N D
Slide 1:PHP 5 Sucks!PHP 5 Rocks!
Adam Trachtenberg eBay Technical Evangelist amt@php.net
Slide 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: ???
Slide 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 Im a pretty good PHP 4 programmer Ive 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 shouldnt be too difficult to learn. Right?
Slide 4:Come Up With a Plan
Install PHP 5 ??????? $$$Profit!!!
Slide 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
Slide 6:Step 1. Install PHP 5: config.nice
#! /bin/sh # # Created by configure './configure' \ '--prefix=/home/adam' \ '--with-zlib' \ '--with-dom=/home/adam/' \ "$@"
Slide 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.
Slide 8:Step 1. Install PHP 5: config.nice
$ ./config.nice --with-libxml-dir=/home/adam ... Thank you for using PHP.
Slide 9:Step 2. ???????
Maybe I should run some PHP 4 scripts and see how they work under PHP 5 Lets start with a simple DOMXML program
Slide 10:Step 2. DOM
<?xml version="1.0"?> <talk> <title>PHP 5 Rocks!</title> </talk>
Slide 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);
Slide 12:Step 2. DOM
Fatal error: Call to undefined function domxml_new_doc() in /home/adam/php5/dom.xml on line 2
Slide 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);
Slide 14:Step 2. DOM
Fatal error: Call to undefined method DOMDocument::append_child() in /home/adam/php5/dom.xml on line 5
Slide 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);
Slide 16:Step 2. DOM
Fatal error: Call to undefined method DOMDocument::dumpMem() in /home/adam/php5/dom.xml on line 17
Slide 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();
Slide 18:Step 2. DOM
<?xml version="1.0"?> <talk><title>PHP 5 Rocks!</title></talk>
Slide 19:Step 2. DOM
<?xml version="1.0"?> <talk> <title>PHP 5 Rocks!</title> </talk>
Slide 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();
Slide 21:Step 2. DOM
<?xml version="1.0"?> <talk> <title>PHP 5 Rocks!</title> </talk>
Slide 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();
Slide 23:Step 2. DOM
Slide 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
Slide 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();
Slide 26:Step 2. DOM
Faster than before Doesnt leak memory Supports more DOM features Plays well with other XML extensions, like XSLT, XPath, and SimpleXML
Slide 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!
Slide 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!
Slide 29:Step 2. DOM
DOM Sucks! SimpleXML Rocks!
Slide 30:Step 2. ???????
Maybe I should run some PHP 4 scripts and see how they work under PHP 5 Lets start with a simple DOMXML program Well, that didnt 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?
Slide 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();
Slide 32:Step 2. MySQL
Fatal error: Call to undefined function mysql_connect() in /home/adam/php5/mysql.php on line 3
Slide 33:Step 2. MySQL
MySQL client libraries are no longer bundled with PHP! You must download and install them yourselves.
Slide 34:Step 2. MySQL
While Im at it, I might as well upgrade to MySQL 4.1.
Slide 35:Step 2. MySQL
However, MySQL 4.1 uses a new client protocol... Turns out, theres a new MySQL extension dedicated to MySQL 4.1 and greater MySQLi The i stands for improved
Slide 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();
Slide 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();
Slide 38:Step 2. MySQL
Warning: Missing argument 2 for mysqli_select_db() in /home/adam/php5/mysql.php on line 7
Slide 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);
Slide 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();
Slide 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
Slide 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()
Slide 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!
Slide 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);
Slide 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);
Slide 46:Step 3. $$$Profit!!!
The good news is that Ive shown you (almost) all the sucky parts of PHP 5. Everything else rocks!
Slide 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
Slide 48:Step 3. $$$Profit!!!
Object-oriented programming XML DOM SimpleXML XSLT XPath SAX XML Pull Parser
Slide 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
Slide 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
Slide 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!
$$$Profit!!! Shameless Plug