PHP 5 Sucks! PHP 5 Rocks!

Download Report

Transcript PHP 5 Sucks! PHP 5 Rocks!

PHP 5 Sucks!
PHP 5 Rocks!
Adam Trachtenberg
eBay Technical Evangelist
[email protected]
In the Beginning...
1. SOAP Sucks! SOAP Rocks!
• Conclusion: SOAP Sucks and Rocks!
2. mod_perl 2.0 Sucks! mod_perl 2.0
Rocks!
• Conclusion: mod_perl 2.0 Sucks!
3. PHP 5 Sucks! PHP 5 Rocks!
• Conclusion: ???
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
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?
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
Come Up With a Plan
1. Install PHP 5
2. ???????
3. $$$Profit!!!
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
Step 1. Install PHP 5
1.
2.
3.
4.
Check out latest version from CVS
Run ./buildconf
Copy over my PHP 4 config.nice file
Run ./config.nice
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
Step 1. Install PHP 5: config.nice
#! /bin/sh
#
# Created by configure
'./configure' \
'--prefix=/home/adam' \
'--with-zlib' \
'--with-dom=/home/adam/' \
"$@"
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
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.
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
Step 1. Install PHP 5: config.nice
$ ./config.nice --with-libxmldir=/home/adam
...
Thank you for using PHP.
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 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
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
Step 2. DOM
<?xml version="1.0"?>
<talk>
<title>PHP 5 Rocks!</title>
</talk>
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
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);
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
Step 2. DOM
Fatal error: Call to undefined function
domxml_new_doc() in /home/adam/php5/dom.xml
on line 2
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
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);
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
Step 2. DOM
Fatal error: Call to undefined method
DOMDocument::append_child() in
/home/adam/php5/dom.xml on line 5
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
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);
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
Step 2. DOM
Fatal error: Call to undefined method
DOMDocument::dumpMem() in
/home/adam/php5/dom.xml on line 17
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
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();
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
Step 2. DOM
<?xml version="1.0"?>
<talk><title>PHP 5 Rocks!</title></talk>
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
Step 2. DOM
<?xml version="1.0"?>
<talk>
<title>PHP 5 Rocks!</title>
</talk>
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
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();
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
Step 2. DOM
<?xml version="1.0"?>
<talk>
<title>PHP 5 Rocks!</title>
</talk>
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
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();
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
Step 2. DOM
Warning
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.
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
Step 2. DOM
1. DOM objects are now actually objects
• Easy to integrate within OOP
• Subclass them to define your own methods
2. DOM methods now use studlyCaps
• Just like the rest of the world
3. DOM behaves like the specification
• Properties are actually properties instead of
methods
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
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();
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
Step 2. DOM
4.
5.
6.
7.
Faster than before
Doesn’t leak memory
Supports more DOM features
Plays well with other XML extensions,
like XSLT, XPath, and SimpleXML
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
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!
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why 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!
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
Step 2. DOM
• DOM Sucks!
• SimpleXML Rocks!
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 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?
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
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();
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
Step 2. MySQL
Fatal error: Call to undefined function
mysql_connect() in
/home/adam/php5/mysql.php on line 3
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
Step 2. MySQL
•
•
MySQL client libraries are no longer bundled
with PHP!
You must download and install them
yourselves.
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
Step 2. MySQL
•
While I’m at it, I might as well upgrade to
MySQL 4.1.
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
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
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
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();
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
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();
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
Step 2. MySQL
Warning: Missing argument 2 for
mysqli_select_db() in
/home/adam/php5/mysql.php on line 7
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
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);
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
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();
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
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
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
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()
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
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!
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 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);
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
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);
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
Step 3. $$$Profit!!!
•
•
The good news is that I’ve shown you (almost)
all the sucky parts of PHP 5.
Everything else rocks!
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
Step 3. $$$Profit!!!
1. 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
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
Step 3. $$$Profit!!!
1. Object-oriented programming
2. XML
•
•
•
•
•
•
DOM
SimpleXML
XSLT
XPath
SAX
XML Pull Parser
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
Step 3. $$$Profit!!!
1. Object-oriented programming
2. XML
3. SQLite
•
•
•
Embedded database library
Guarantees access to database in PHP 5
Not “Lite” at all:
•
•
•
Transactions
Triggers
Subselects
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
Step 3. $$$Profit!!!
1. Object-oriented programming
2. XML
3. SQLite
4. Iterators
5. Error handling with exceptions
6. SOAP extension
7. Streams, wrappers, and filters
8. Reflection classes
9. Better command line processing
10. Compliant HTML from Tidy
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
In the Beginning...
1. SOAP Sucks! SOAP Rocks!
• Conclusion: SOAP Sucks and Rocks!
2. mod_perl 2.0 Sucks! mod_perl 2.0
Rocks!
• Conclusion: mod_perl 2.0 Sucks!
3. PHP 5 Sucks! PHP 5 Rocks!
• Conclusion: PHP 5 Rocks!
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!
$$$Profit!!!
Shameless
Plug
Adam Trachtenberg: eBay Evangelist
Why PHP 5 Sucks! Why PHP 5 Rocks!