## 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 `:-)`