namespace Acme\Account;
!
use Acme\Account\User;
!
class User {
public static function err($message) {
throw new User\Exception\SomeError($message);
}
}
!
namespace Acme\Account\User\Exception;
!
class SomeError extends \Exception { }
!
\Acme\Account\User::err("Confused Yet?");
Slide 52
Slide 52 text
It can seem arbitrary and confusing
Slide 53
Slide 53 text
It helps to think of namespaces
representing a filesystem
Slide 54
Slide 54 text
helps to think of namespace
representing a filesystem
Slide 55
Slide 55 text
PHP does not care where you put your
namespaces and classes on disk!
Slide 56
Slide 56 text
But if you use a filesystem as an
analogy for namespaces...
Slide 57
Slide 57 text
The namespace keyword tells you
where you are in the filesystem
Slide 58
Slide 58 text
namespace Acme\Account;
class User
{
}
!
$ cd Acme/Account
$ touch User.php
!
# Acme/Account/User.php
Slide 59
Slide 59 text
namespace Acme\Account;
throw new Exception\SomeError("hi");
!
$ cd Acme/Account
$ cat Exception/SomeError.php
!
# Acme/Account/Exception/SomeError.php
Slide 60
Slide 60 text
namespace Acme\Account;
throw new Exception("wait, what?");
!
$ cd Acme/Account
$ cat Exception.php
!
# Acme/Account/Exception.php
Slide 61
Slide 61 text
namespace Acme\Account;
throw new \Exception("oh, i see!");
!
$ cd Acme/Account
$ cat /Exception.php
!
# Exception.php
How do namespaces address the
[incredibly long class name here]
problem mentioned earlier?
Slide 65
Slide 65 text
The use Keyword
Slide 66
Slide 66 text
Namespaces and classes can be
imported into a file or namespace
Slide 67
Slide 67 text
namespace Acme\Store\Controller;
!
use Acme\Account\User;
!
$user = new User();
!
# User = Acme\Account\User
Slide 68
Slide 68 text
namespace Acme\Store\Controller;
!
use Acme\Account;
!
$user = new Account\User();
Slide 69
Slide 69 text
namespace Acme\Store\Controller;
!
use Acme\Account\Errors;
!
throw new Errors\AccountPastDue();
Slide 70
Slide 70 text
Two namespaces or classes of
the same name cannot be
imported by use at the same time
Slide 71
Slide 71 text
namespace Acme\Store\Controller;
!
use Acme\Account\Errors;
use Acme\PayPalClient\Errors;
!
PHP Fatal error: Cannot use Acme
\PayPalClient\Errors as Errors
because the name is already in use
Slide 72
Slide 72 text
namespace Acme\Store\Controller;
!
use Acme\Account\Errors;
use Acme\PayPalClient\Errors;
!
PHP Fatal error: Cannot use Acme
\PayPalClient\Errors as Errors
because the name is already in use
Slide 73
Slide 73 text
Namespaces and classes can be
aliased when they are imported
Slide 74
Slide 74 text
namespace Acme\Store\Controller;
!
use Acme\Account\Errors as AccountErrors;
use Acme\PayPalClient\Errors as PayPalErrors;
!
if ($user->isBad()) {
throw new AccountErrors\BadUser(
"you know what you did"
);
}
try {
$paypal->tryToCharge($user);
} catch (PayPalErrors\TransactionError $e) {
throw new AccountErrors\TransportError($e);
}
Slide 75
Slide 75 text
namespace Acme\Store;
!
use Silex\Controller as BaseController;
!
class Controller extends BaseController
{
}
Slide 76
Slide 76 text
namespace Acme\Account\User;
!
use Exception;
!
throw new Exception("yay!");
!
# Exception.php
Slide 77
Slide 77 text
namespace Acme\Account;
!
use Acme\Account\User;
!
class User {
public static function err($message) {
throw new User\Exception\SomeError($message);
}
}
!
namespace Acme\Account\User\Exception;
!
class SomeError extends \Exception { }
!
\Acme\Account\User::err("A little less confusing?");
Slide 78
Slide 78 text
Autoloading
Slide 79
Slide 79 text
Just use your classes
Slide 80
Slide 80 text
# Acme\User is not defined
!
$user = new Acme\User();
!
# Acme\User is defined
Slide 81
Slide 81 text
Magic!
Slide 82
Slide 82 text
You probably won't use most of what
you are about to learn directly...
(it is good history to know, though!)
Slide 83
Slide 83 text
__autoload
since 5
Slide 84
Slide 84 text
The __autoload function is called
anytime a class does not exist
Slide 85
Slide 85 text
function __autoload($class) {
if ($class === "Acme\\Account\\User") {
// do something to cause this class
// to become defined
require __DIR__."/src/user.inc";
}
}
Slide 86
Slide 86 text
The major limitation of __autoload
is that it is only one function
Slide 87
Slide 87 text
spl_autoload_register
since 5.1.2
Slide 88
Slide 88 text
With spl_autoload_register more than
one autoloader implementation can
be registered at the same time
Slide 89
Slide 89 text
spl_autoload_register(
// Registers Acme's autoloader
Acme::autoloader
);
!
spl_autoload_register(
// Registers Doctrine's autoloader
Doctrine::autoloader
);
!
spl_autoload_register(function($class) {
// Register a rarely used class
if ($class === "Acme\\RarelyUsed\\User") {
require __DIR__."/src/user.inc";
}
});
Slide 90
Slide 90 text
Don't write an
autoloader
Slide 91
Slide 91 text
Use an off-the-shelf autoloader
Slide 92
Slide 92 text
No content
Slide 93
Slide 93 text
This means you will have to
follow an autoloading standard
Slide 94
Slide 94 text
PSR-0
Slide 95
Slide 95 text
PHP-FIG
PHP Framework Interoperability Group
Slide 96
Slide 96 text
PSR-0 Autoloading Standard
Slide 97
Slide 97 text
–Larry Garfield
"For sufficiently vague definitions of 'accepted',
May 2009 is the date I use."
Slide 98
Slide 98 text
Remember the filesystem analogy?
Slide 99
Slide 99 text
PSR-0 essentially codified that
concept and made it a thing
Slide 100
Slide 100 text
Namespaces become directories
Slide 101
Slide 101 text
Classes become files with .php suffix
Slide 102
Slide 102 text
Acme\Account\User
Slide 103
Slide 103 text
Acme/Account/User.php
Slide 104
Slide 104 text
PSR-0 also supports legacy
PEAR style naming conventions
Slide 105
Slide 105 text
Acme\Account\User
!
Acme_Account_User
Slide 106
Slide 106 text
Acme/Account/User.php
!
Acme/Account/User.php
Slide 107
Slide 107 text
Legacy rules are kinda
convoluted
Slide 108
Slide 108 text
_ is converted to /
but only in the class name
Slide 109
Slide 109 text
Acme\Web_Site\User_Controller
Slide 110
Slide 110 text
Acme/Web_Site/User/Controller.php
Slide 111
Slide 111 text
PSR-0 had a handful of other
relatively insignificant* issues
* the significance of the issues varies wildly depending on who you ask
Slide 112
Slide 112 text
PSR-0 was widely adopted by
PHP-FIG member projects