@lew
The Null Object design pattern is a behavioral design pattern that provides an object-oriented way to handle null values. It suggests creating a special object that behaves like a null value but has its own implementation of methods.
Here's an example implementation of the Null Object design pattern in PHP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
interface Logger { public function log($message); } class FileLogger implements Logger { private $filename; public function __construct($filename) { $this->filename = $filename; } public function log($message) { $fh = fopen($this->filename, 'a'); fwrite($fh, $message . " "); fclose($fh); } } class NullLogger implements Logger { public function log($message) { // Do nothing } } function createLogger($filename = null) { if ($filename) { return new FileLogger($filename); } else { return new NullLogger(); } } |
In this implementation, we have an interface called Logger
that defines the log
method. We also have two classes that implement this interface: FileLogger
and NullLogger
.
The FileLogger
class writes log messages to a file specified in the constructor. The NullLogger
class does nothing when log
is called.
The createLogger
function creates either a FileLogger
or a NullLogger
depending on whether a filename is provided or not.
Now, when we want to log something, we can create a logger like this:
1 2 3 4 5 |
$logger = createLogger('/path/to/logfile'); $logger->log('This message will be logged to the file'); $logger = createLogger(); $logger->log('This message will not be logged anywhere'); |
This way, we don't have to worry about handling null values or checking if a logger object is null before calling its methods. We can always call log
without fear of causing a runtime error.