PHP 5 Sucks! PHP 5 Rocks!

scacchicgardenSoftware and s/w Development

Dec 13, 2013 (3 years and 8 months ago)

125 views

PHP 5 Sucks!

PHP 5 Rocks!


Adam Trachtenberg

eBay Technical Evangelist

amt@php.net

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

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: ???

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

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?

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

Come Up With a Plan

1.

Install PHP 5

2.

???????

3.

$$$Profit!!!

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

Step 1. Install PHP 5

1.
Check out latest version from CVS

2.
Run
./buildconf

3.
Copy over my PHP 4
config.nice

file

4.
Run
./config.nice

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

Step 1. Install PHP 5:
config.nice

#! /bin/sh

#

# Created by configure


'./configure'
\

'
--
prefix=/home/adam'
\

'
--
with
-
zlib'
\

'
--
with
-
dom=/home/adam/'
\

"$@"


Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

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.

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

Step 1. Install PHP 5:
config.nice

$ ./config.nice
--
with
-
libxml
-
dir=/home/adam


...


Thank you for using PHP.

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

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

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

Step 2. DOM

<?xml version="1.0"?>

<talk>


<title>PHP 5 Rocks!</title>

</talk>

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

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);

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

Step 2. DOM

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

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

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);

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

Step 2. DOM

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

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

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);

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

Step 2. DOM

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

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

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
();

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

Step 2. DOM

<?xml version="1.0"?>

<talk><title>PHP 5 Rocks!</title></talk>

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

Step 2. DOM

<?xml version="1.0"?>

<talk>


<title>PHP 5 Rocks!</title>

</talk>

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

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();

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

Step 2. DOM

<?xml version="1.0"?>

<talk>


<title>PHP 5 Rocks!</title>

</talk>

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

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
();

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

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.

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

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

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

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();

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

Step 2. DOM

4.
Faster than before

5.
Doesn’t leak memory

6.
Supports more DOM features

7.
Plays well with other XML extensions,
like XSLT, XPath, and SimpleXML

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

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!

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

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!

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

Step 2. DOM


DOM Sucks!


SimpleXML Rocks!

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

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?

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

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();

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

Step 2. MySQL

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

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

Step 2. MySQL


MySQL client libraries are no longer bundled
with PHP!


You must download and install them
yourselves.

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

Step 2. MySQL


While I’m at it, I might as well upgrade to
MySQL 4.1.

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

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

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

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();

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

Step 2. MySQL

$db = mysql
i
_connect($server, $user,
$password);

mysql
i
_select_db("users");

$r = mysql
i
_query("SELECT user FROM
users");

while ($row = mysql
i
_fetch_assoc($r)) {


print $row['user'];

}

mysql
i
_close();

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

Step 2. MySQL

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

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

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
);

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

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();

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

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

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

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()


Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

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!

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

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);

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

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);

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

Step 3. $$$Profit!!!


The good news is that I’ve shown you (almost)
all the sucky parts of PHP 5.


Everything else rocks!

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

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

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

Step 3. $$$Profit!!!

1.
Object
-
oriented programming

2.
XML


DOM


SimpleXML


XSLT


XPath


SAX


XML Pull Parser

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

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

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

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

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

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!

Why PHP 5 Sucks! Why PHP 5 Rocks!

Adam Trachtenberg: eBay Evangelist

$$$Profit!!!


Shameless

Plug