## Elephant taming for snake lovers
### aka PHP for pythonistas
Wes Mason
[@1stvamp](http://twitter.com/1stvamp)
## Who?
- / `@1stvamp`
- Online services, [Canonical](http://www.canonical.com/)
- Open source
- Former publisher of PHP Weekly
## PHP
- Dynamic/interpreted language
- Web applications
- OO, functional
- "Personal HomePage"
- Bad reputation
- **Extremely popular**
### Differences
- Braces, semi-colons, mostly-ignored whitespace (C family)
- Special variable symbol (`$`)
- Heavily (populated | polluted) global namespace
### More differences
- Geared towards file-based inclusion (anyone remember SSI?)
- Web server inbuilt functions and globals
- Loosely typed, with scalar types
### C-stylee
<?php
$foo = true;
// Let's check $foo!
if ($foo) {
/**
* I guess $foo was TRUE!
*/
echo 'Hello World';
}
# Ambiguity? I barely know her.
print('Goodbye');
exit(0);
### Variables
<?php
$foo = 'bar';
$baz = $foo;
$test = [];
define('MY_CONSTANT', 'hello world');
echo MY_CONSTANT;
### Global namespace
- 9,541 global functions and methods listed on docs.php.net
- 4,559 of these are functions without a containing class
- Many of which rely on extensions (e.g. Apache, APC, MySQL etc.)
- 99 of which are in a namespace
### Meanwhile in Python..
$ python3
Python 3.4.3 (default, Mar 26 2015, 22:03:40)
[GCC 4.9.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> len(dir(__builtins__))
148
### Files all the way down
- `include`, `include_once`, `require`, `require_once`
- Namespaces (modules) are "syntax sugar", you can declare more than in a single file
- *Importing* namespaces is done either manually (e.g. `require`), or with user-space autoload hooks
### Beginner friendly bootstrapping
- `echo '<?php print "Hello world";' > index.php`
- `scp index.php my_server:~/public_html`
- Open `my_server/index.php` in a browser.
- Hit the pub and declare you're a developer.
### No WSGI, no worries
- WSGI makes sense from an engineering perspective
- Enhances maintenance of large ongoing projects
- Provides a standard API that all frameworks and app runners speak
### Meanwhile, in PHP-land..
- PHP includes a massive array of functions, variables, constants, and even some APIs for web dev.
- `header()`, `move_uploaded_file()`, `http_digest_parse()`, etc.
### in PHP-land cont.
- `$_GET`, `$_POST`, `$_REQUEST`, `$_FILES` etc.
- This easy boostrap and deployment story makes writing an app fun for beginners.
## Similarities
#### simildifferities? Diffelarities? Similirences?
- An "everything and the kitchen sink" philosophy
- ..`serialize` (like pickle), `json`, file reading, gzip/zip handling, mail sending, databases, etc.
- Namespaces (packages and modules)
## Similarities cont.
- Type hinting (similar to PEP-484)
- Exceptions
- Rich data-types...kinda...ok...usually just one, but it's very rich.
## Similarities cont.
- Lambdas, variable scoping, generators, functional helpers
- Availability (pretty much everywhere, including Windows)
- Healthy userspace libraries in a repository (packagist.org, the PHP'ers cheeseshop)
### Generators
<?php
function gen_one_to_three() {
for ($i = 1; $i <= 3; $i++) {
// Note that $i is preserved between yields.
yield $i;
}
}
### Namespaces
**Note**: Namespaces uses the `\` separator, e.g.
<?php
namespace 'wesmason';
class Foo {
}
namespace 'wesmason\bar';
class Baz {
}
### Namespaces cont.
<?php
$foo = new wesmason\Foo;
$baz = new wesmason\Bar\Baz();
### Autoloading
<?php
function __autoload($class_name) {
include $class_name . '.php';
}
$obj = new MyClass1();
$obj2 = new MyClass2();
### Autoloading cont.
<?php
function __autoload($name) {
$parts = explode($name, '\\');
require $parts[0];
}
### The Almight Array
- Workhorse of PHP datatypes
- tuple, namedtuple, list, dict and OrderedDict, all rolled into one
### array()
<?php
$foo = array(1, 2, 'bar');
$baz = [ 'fred' => 42, 'velma' => 50 ];
assert(in_array('velma', $foo) === false);
assert(in_array('fred', $baz) === true);
## Composer
### pip for PHP
- `composer install wordpress==x.x.x`
- packagist.org
- Pinning (and vendoring)
- JSON package metadata format
### `composer.json`
{
"name": "wilgucki/csv",
"description": "Laravel 5 package for writing and reading CSV files",
"keywords": ["Laravel", "csv"],
"license": "MIT",
"authors": [
{
"name": "Maciej Wilgucki",
"email": "mwilgucki+packagist@gmail.com"
}
],
"require": {
"php": ">=5.5.0"
},
"autoload": {
"psr-4": {
"Wilgucki\\Csv\\": "src"
}
}
}
### Autoloaders
**Note**: That damned `\` again, e.g.
{
"autoload": {
"psr-4": {"Acme\\": "src/"}
}
}
## XDebug
- Remote debugger, with breakpoints, stepping, strack introspection etc. (think PDB or Celerys rdb)
- Profiler (think cProfile)
## XDebug cont.
- Remote debugging network protocol, with a bunch of clients (including inbuilt support in IDEs)
- PHP C extension, with `xdebug_*` functions to call breakpoints, set profile timers etc.
### Helper functions
<?php
$debug_function = function() {
echo xdebug_call_function();
};
## Speaking of debugging..
### ..what about a REPL?
- `php -a`
- [phpsh](http://www.phpsh.org/)
- [boris](https://github.com/borisrepl/boris)
- [psysh](http://psysh.org/)
### boris
$ composer global install "d11wtq/boris"
$ export PATH="$PATH:~/.composer/vendor/bin/"
...
$ boris
### boris cont.
$ boris
[1] boris> $test = ['foo', 'bar', 'baz'];
// array(
// 0 => 'foo',
// 1 => 'bar',
// 2 => 'baz'
// )
[2] boris> foreach($test as $t) {
[2] *> echo $t . "\n";
[2] *> }
foo
bar
baz
[3] boris> ^D
## docs.php.net
- `http://php.net/`**`function-name-here`**
- Large project in a git repo, with build files, translations, examples etc.
- Having a large global namespace means having GOOD documention.
## Migratin'
- Long ramp up period between PHP4 and PHP5, lots of breakages
- Majority of open source projects now on 5
- Good support for new releases on non-cloudy-hosts
### What year is it, who's the president?
- PHP 7 - faster, return type hinting, AST, some breakages
- HHVM - JIT based runtime, compatible with PHP 5 (ish)
### Hand me my flux capacitor
- HippyVM - RPython implementation of PHP, e.g. it runs on PyPy
- Hack - fork based on HHVM engine, with extra language features that aren't compatible
### Talking about versions..
### Talking about (more) versions..
## sys.exit(0)
- Slides: [1stvamp/elephant-taming-talk](https://github.com/1stvamp.org/elephant-taming-talk)
- PHP: [php.net](http://php.net/)
- PHP The Right way: [phptherightway.com](http://www.phptherightway.com/)
- Python wiki: [PythonVsPhp](https://wiki.python.org/moin/PythonVsPhp)
## ^D
- Jonathan "Joff" Oliver: [about.me/joffie](http://about.me/joffie)
- Grab me and say hi `:-)`