php-standard-library/default
Provides a DefaultInterface for PHP classes to expose standardized “default” instances. Helps ensure consistent default construction across libraries and apps with a simple, shared contract.
Installation
composer require php-standard-library/default
Add to composer.json under require or require-dev based on needs.
First Use Case
Define a class implementing DefaultInterface:
use PhpStandardLibrary\Default\DefaultInterface;
class User implements DefaultInterface
{
public static function getDefault(): self
{
return new self('default@example.com', 'guest');
}
public function __construct(
private string $email,
private string $name
) {}
}
Use the default instance:
$defaultUser = User::getDefault();
Where to Look First
DefaultInterface in src/DefaultInterface.php for contract details.tests/ for usage examples and edge cases.Standardized Defaults in Services
class OrderService
{
public function createOrder(User $user = null): Order
{
$user = $user ?? User::getDefault();
return new Order($user);
}
}
Dependency Injection
// In Laravel's service container
$app->bind(User::class, function () {
return User::getDefault();
});
Factory Patterns
class UserFactory
{
public static function createGuest(): User
{
return User::getDefault();
}
}
class UserFacade extends Facade
{
public static function guest(): User
{
return User::getDefault();
}
}
public function rules()
{
return [
'email' => 'required|email',
'name' => 'required|string',
];
}
public function prepareForValidation()
{
$this->merge([
'email' => User::getDefault()->email,
'name' => User::getDefault()->name,
]);
}
Immutable Defaults
$default = User::getDefault();
$modified = clone $default;
$modified->name = 'Admin';
Thread Safety
public static function getDefault(): self
{
static $instance = null;
return $instance ?? ($instance = new self(...));
}
Testing Quirks
$this->mock(User::class)
->shouldReceive('getDefault')
->andReturn(new User('test@example.com', 'Test'));
instanceof checks:
if ($user instanceof DefaultInterface) {
$default = $user::getDefault();
}
config(['user.default' => ['email' => 'custom@example.com']]);
// In User::getDefault()
$config = config('user.default', ['email' => 'default@example.com']);
return new self($config['email'], 'guest');
trait DynamicDefault
{
public static function getDefault(): self
{
return new self(...self::defaultValues());
}
protected static function defaultValues(): array
{
return [];
}
}
__serialize()/__unserialize() to preserve defaults:
public function __serialize(): array
{
return ['email' => $this->email, 'name' => $this->name];
}
public function __unserialize(array $data): void
{
$this->email = $data['email'] ?? User::getDefault()->email;
$this->name = $data['name'] ?? User::getDefault()->name;
}
$this->app->singleton(User::class, function () {
return User::getDefault();
});
How can I help you explore Laravel packages today?