- FEATURES
- Autoload
- Class Reflection
- Magic Methods
- Exceptions
- Late Static Binding
- Type Hinting
- SPL
- PHPUNIT
- PHAR
- COMPOSER
- Carbon
- Guzzle
- Faker
- Math
- Requests
- DESIGN PATTERNS
-
Singleton Pattern
- Observer Pattern
- Strategy Pattern
- Dependency Injection
- Middleware
- Registry
- SYMFONY
- Routes
- Annotations
- Flex
- Controllers
- Doctrine
- Templating
- VERSIONS
- Php7.4
- Php8.0
- SECURITY
- Filter Input
- Remote Code Injection
- Sql Injection
- Session Fixation
- File Uploads
- Cross Site Scripting
- Spoofed Forms
- CSRF
- Session Hijacking
- MODERN PHP
- Composer
- Autoloader
- Package
- Releases
- Generators
- Dependency Injection
- Middleware
- CUSTOM FRAMEWORK
- App
- Http Foundation
- Front Controller
- Routing
- Render Controller
- Resolver
- SoC
- FRAMEWORKS
- Slim
- Symfony V5
- Laravel V8
- Laminas V3
- Codeigniter V4
Single instance
Singleton pattern restricts the instantiation of a class to a single instance. Private keyword hides the class constructor for outside.
class MyClass
{
private static $instance;
public $userId;
/**
* Private constructor
* The class cannot be intialized from outside
*/
private function __construct() {}
/**
* Static methods or properties can be access
* only as part of a class itself
*/
public static function getInstance()
{
if (self::$instance === null) {
self::$instance = new self(); // Look Here
}
return self::$instance;
}
}
// $obj = new MyClass(); // Fatal Error
$obj = MyClass::getInstance();
$obj->userId = 2;
$obj2 = MyClass::getInstance();
echo $obj->userId; // 2
Example
Prevent class from being extended, declare it as final. Prevent second instance of the class (private _clone() or __wake()).
// App.php
declare(strict_types=1);
namespace DesignPatterns\Singleton;
final class App
{
private static $instance;
/**
* get the instance via lazy initialization
* intialization created on first usage
*/
public static function getInstance() : App
{
if (! static::$instance) {
static::$instance = new self();
}
return static::$instance;
}
/**
* prevent outside multiple instantiantion
* getInstance() must be used instead
*/
private function __construct()
{
}
/**
* prevent the instance from being clone
* which will create a second instance of it
*/
private function __clone()
{
}
/**
* prevent the instance from being unserialized
* which will create a second instance of it
*/
private function __wakeup()
{
}
}
// index.php
namespace DesignPatterns\Singleton;
require_once __DIR__ . "/../../autoloader.php";
use DesignPatterns\Singleton\App;
$A = App::getInstance();
$B = App::getInstance();
echo $A instanceof App; // true
echo $B instanceof App; // true
// autoloader.php
function classAutoloader($class) {
$tmp = explode("\\", $class);
require_once join("/", $tmp) . ".php";
}
spl_autoload_register("classAutoloader");
Last update: 531 days ago